Umgang mit Leerzeichen in Dateinamen unter Linux
Die zentralen Thesen
Wenn Sie auf einem Linux-System einen Dateinamen mit Leerzeichen haben, können Sie Ihren Dateinamen in Anführungszeichen setzen, damit Bash ihn korrekt behandeln kann. Die Tab-Vervollständigung erleichtert die Eingabe von Dateinamen in der Befehlszeile, auch wenn sie Leerzeichen enthalten.
Wie die meisten Betriebssysteme unterstützt Linux Dateinamen mit Leerzeichen. Die Verwendung dieser Dateinamen in der Befehlszeile ist jedoch nicht immer einfach. Es gibt verschiedene Möglichkeiten, wie Sie mit Dateinamen umgehen können, die Leerzeichen enthalten.
Wie funktionieren Linux-Dateinamen?
Alles, was auf der Festplatte Ihres Computers gespeichert ist, muss einen Namen haben. Ohne einen Namen gäbe es keine Dateien. Alle Anwendungen und Daemons, die beim Hochfahren Ihres Computers gestartet werden, sowie die gesamte von Ihnen verwendete Software müssen identifiziert und in einem Dateisystem gespeichert werden. Diese Identifikation ist der Name der Datei.‘
Das Gleiche gilt für die Dateien, die Sie erstellen oder installieren. Alle Ihre Dokumente, Bilder und Musik benötigen Dateinamen. Ohne Dateinamen könnten keine Ihrer digitalen Assets existieren. Da Dateinamen so wichtig sind, versucht Linux, so wenig Regeln wie möglich für ihre Zusammensetzung festzulegen.
Unter Linux kann ein Dateiname jedes Zeichen außer dem Schrägstrich „/“ und dem Nullzeichen 0x00 enthalten. Das Nullzeichen wird verwendet, um das Ende einer Zeichenfolge zu markieren, daher darf es nicht in der Zeichenfolge selbst vorhanden sein, da Linux sonst den Dateinamen an der Position des Nullzeichens abschneiden würde. Der Schrägstrich „/“ wird als Trennzeichen in Verzeichnispfaden verwendet.
Bei Dateinamen wird die Groß-/Kleinschreibung beachtet und sie können einschließlich des Nullzeichens bis zu 255 Byte lang sein . Verzeichnispfade können einschließlich des Nullzeichens bis zu 4096 Byte lang sein. Beachten Sie, dass es sich hierbei um die Länge in Bytes handelt, die möglicherweise nicht direkt den Zeichen entspricht. 16-Bit-Unicode-Zeichen belegen beispielsweise jeweils zwei Bytes.
Retro-Computing-Enthusiasten und diejenigen mit langem Gedächtnis wissen, dass in den frühen Tagen der Personalcomputer das Disk Operating System von Microsoft , DOS, die Groß-/Kleinschreibung nicht beachtete und eine Dateinamenbeschränkung von acht Zeichen sowie eine dreistellige Erweiterung hatte .
Beim Benennen der Dateien musste man sehr überlegt und manchmal auch kreativ sein. Im Vergleich dazu bedeutet die Freiheit, die wir heute haben, dass wir Dateien beliebig benennen können, ohne an etwas anderes als die Beschreibung zu denken, die wir für diese Datei erstellen.
Was uns jedoch bei Dateinamen am häufigsten aus der Fassung bringt, sind nicht die Zeichen, die wir eingeben, sondern die Leerzeichen zwischen ihnen.
Warum Leerzeichen in Linux-Dateinamen lästig sind
Shells wie Bash interpretieren eine durch Leerzeichen getrennte Wortfolge als einzelne Befehlsargumente und nicht als einzelnes Argument. Hier ist ein Beispiel touch
für die Erstellung einer neuen Datei mit dem Namen „meine neue Datei.txt“.
touch my new file.txt
ls
Wie wir sehen können, ls
werden drei Dateien erstellt, eine mit dem Namen „my“, eine weitere mit dem Namen „new“ und eine weitere mit dem Namen „file.txt“.
Beachten Sie, dass es touch
keine Beschwerde gab oder einen Fehler auslöste. Es führt aus, was wir seiner Meinung nach von ihm verlangen. Es führt uns also stillschweigend zur Befehlszeile zurück. Wenn wir nicht motiviert sind, dies zu überprüfen, wissen wir nicht, dass die Dinge nicht nach Plan verlaufen sind.
Um die gewünschte Datei zu erstellen, müssen wir ein Zitat oder ein Escapezeichen verwenden.
So zitieren und maskieren Sie Leerzeichen
Wenn wir den gesamten Dateinamen in Anführungszeichen setzen, touch
weiß es, dass der zitierte Text als einzelnes Argument behandelt werden muss.
touch 'my new file.txt'
ls
Dieses Mal erhalten wir die einzelne Datei, die wir erwarten.
Wir können das gleiche Ergebnis erzielen, wenn wir das Backslash-Zeichen „ \
“ verwenden, um die Leerzeichen zu maskieren. Durch das „Escapen“ der Leerzeichen werden sie nicht als Sonderzeichen – also Argumenttrennzeichen – behandelt, sondern als einfache alte Leerzeichen betrachtet.
touch my\ second\ new\ file.txt
ls
Das funktioniert, aber das Escapen von Leerzeichen macht die Eingabe von Dateinamen langsamer und fehleranfälliger. Es kann wirklich hässlich werden, wenn Verzeichnisnamen auch Leerzeichen enthalten.
cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak
ls
Dieser Befehl kopiert eine einzelne Textdatei aus einem Verzeichnis namens „dir one“ in ein Verzeichnis namens „dir two“ und speichert die Kopie als BAK-Datei. Und es ist ein ziemlich einfaches Beispiel.
So beheben Sie das Platzproblem an seiner Ursache
Wenn es sich um Ihre eigenen Dateien handelt, können Sie die Richtlinienentscheidung treffen, niemals Leerzeichen zu verwenden, und Dateinamen wie diesen erstellen (oder in großen Mengen umbenennen ).
mynewtextfile.txt
Zugegebenermaßen ist das eine robuste Lösung, aber dennoch hässlich. Es gibt bessere Optionen, z. B. die Verwendung von Bindestrichen „ -
“ oder Unterstrichen „ _
„, um Ihre Wörter zu trennen.
my-new-text-file.txt
my_new_text_file.txt
Beides umgeht das Problem und ist lesbar. Wenn Sie Ihren Dateinamen keine zusätzlichen Zeichen hinzufügen möchten, können Sie CamelCase verwenden , um Ihre Dateinamen wie folgt lesbar zu machen:
MyNewTextFile.txt
Die Tab-Erweiterung erleichtert den Umgang mit Leerzeichen
Natürlich ist es nur hilfreich, eine Namenskonvention zu übernehmen und diese einzuhalten, wenn Sie mit Ihren eigenen Dateien arbeiten. Es ist unwahrscheinlich, dass Dateien, die von irgendwo anders stammen, Ihrer angenommenen Namenskonvention folgen.
Mithilfe der Tabulatorerweiterung können Sie Dateinamen für uns präzise ausfüllen. Nehmen wir an, wir möchten die BAK-Datei, die wir in „dir two“ erstellt haben, mit löschenrm
.
Wir beginnen mit der Eingabe von „rm dir“, da wir den rm
Befehl verwenden und wissen, dass der Verzeichnisname mit „dir“ beginnt.
rm dir
Durch Drücken der „Tab“-Taste sucht Bash nach Übereinstimmungen im aktuellen Verzeichnis.
Es gibt zwei Verzeichnisse, die mit „dir“ beginnen, und in beiden Fällen ist das nächste Zeichen ein Leerzeichen. Daher fügt Bash das Backslash-Zeichen „ \
“ und ein Leerzeichen hinzu. Bash wartet dann darauf, dass wir den nächsten Charakter bereitstellen. Es benötigt das nächste Zeichen, um zwischen den beiden möglichen Übereinstimmungen in diesem Verzeichnis zu unterscheiden.
Wir geben ein „t“ für „zwei“ ein und drücken dann noch einmal die Tabulatortaste.
Bash vervollständigt den Verzeichnisnamen für uns und wartet darauf, dass wir den Anfang des Dateinamens eingeben.
Wir haben nur eine Datei in diesem Verzeichnis, daher reicht die Eingabe des ersten Buchstabens des Dateinamens, „m“, aus, um Bash mitzuteilen, welche Datei wir verwenden möchten. Die Eingabe von „m“ und das Drücken der „Tabulatortaste“ vervollständigen den Dateinamen für uns und „Enter“ führt den gesamten Befehl aus.
Durch die Tabulatorerweiterung können Sie ganz einfach sicherstellen, dass Sie die richtigen Dateinamen eingeben, und sie beschleunigt auch die Navigation und Eingabe in der Befehlszeile im Allgemeinen.
So verwenden Sie Dateinamen mit Leerzeichen in Bash-Skripten
Es ist keine Überraschung, dass Skripte genau die gleichen Probleme mit Leerzeichen in Dateinamen haben wie die Befehlszeile. Wenn Sie einen Dateinamen als Variable übergeben, stellen Sie sicher, dass Sie den Variablennamen in Anführungszeichen setzen.
Dieses kleine Skript überprüft das aktuelle Verzeichnis auf Dateien, die dem Dateimuster „*.txt“ entsprechen, und speichert sie in einer Variablen namens file_list
. Eine for-Schleife wird verwendet, um für jede einzelne eine einfache Aktion auszuführen.
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone
Kopieren Sie diesen Text in einen Editor und speichern Sie ihn in einer Datei namens „files.sh“. Verwenden Sie dann den Befehl chmod , um ihn ausführbar zu machen.
chmod +x files.sh
Wir haben einige Dateien in diesem Verzeichnis. Einer hat einen einfachen Dateinamen und die anderen beiden verwenden Unterstriche „ _
“ oder Bindestriche „ -
“ anstelle von Leerzeichen. Das sehen wir, wenn wir das Skript ausführen.
./files.sh
Das scheint gut zu funktionieren. Aber ändern wir die Dateien im Verzeichnis gegen Dateien, deren Namen Leerzeichen enthalten.
./files.sh
Jedes Wort in jedem Dateinamen wird so behandelt, als wäre es ein eigenständiger Dateiname, und daher schlägt das Skript fehl. Aber alles, was wir tun müssen, damit das Skript Leerzeichen in Dateinamen verarbeitet, ist, die $file
Variable innerhalb der for
Schleife in Anführungszeichen zu setzen.
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done
Beachten Sie, dass das Dollarzeichen „ $
„in den Anführungszeichen steht. Wir haben diese Änderung vorgenommen und in der Skriptdatei „files.sh“ gespeichert. Diesmal werden die Dateinamen korrekt behandelt.
./files.sh
Distanziert, aber nicht schuppig
Das Vermeiden von Leerzeichen in Ihren eigenen Dateinamen bringt Sie nur bedingt weiter. Es ist unvermeidlich, dass Sie auf Dateien aus anderen Quellen stoßen, deren Namen Leerzeichen enthalten. Wenn Sie diese Dateien in der Befehlszeile oder in Skripts verwalten müssen, gibt es glücklicherweise einfache Möglichkeiten, dies zu tun.
Linux-Befehle |
|
Dateien |
tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · Join · jq · Fold · Uniq · Journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · konvertieren · rclone · shred · srm · scp · gzip · chattr · schneiden · finden · umask · wc · tr |
Prozesse |
alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · geschichte · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · Timeout · Wall · Yes · Kill · Sleep · Sudo · Su · Time · Groupadd · Usermod · Groups · LSHW · Shutdown · Reboot · Halt · Poweroff · Passwd · LSCPU · Crontab · Date · BG · FG · PIDOF · Nohup · PMAP |
Vernetzung |
netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
Schreibe einen Kommentar