Die Ausgabe von ls
zu verwenden, um Dateinamen abzurufen, ist eine schlechte Idee . Dies kann zu Fehlfunktionen und sogar zu gefährlichen Skripts führen. Dies liegt daran, dass ein Dateiname alle Zeichen außer enthalten kann /
und das null
Zeichen, und ls
nicht eine dieser beiden Zeichen als Trennzeichen verwenden, so dass, wenn ein Dateiname ein Leerzeichen oder eine neue Zeile hat, Sie werden unerwartete Ergebnisse erhalten.
Es gibt zwei sehr gute Möglichkeiten, Dateien zu durchlaufen. Hier habe ich einfach echo
gezeigt, wie ich etwas mit dem Dateinamen machen kann. Sie können jedoch alles verwenden.
Die erste besteht darin, die nativen Globbing-Funktionen der Shell zu verwenden.
for dir in */; do echo "$dir" done
Die Shell erweitert sich */
in separate Argumente, die die for
Schleife liest. Auch wenn der Dateiname ein Leerzeichen, eine neue Zeile oder ein anderes merkwürdiges Zeichen enthält, for
wird jeder vollständige Name als atomare Einheit angezeigt . Die Liste wird in keiner Weise analysiert.
Wenn Sie rekursiv in Unterverzeichnissen gehen wollen, dann wird dies nicht tun, wenn Ihre Shell einige erweiterte Globbing Funktionen (zB bash
‚s globstar
. Wenn Ihre Shell nicht über diese Eigenschaften haben, oder wenn Sie wollen sicherstellen, dass Ihr Skript funktioniert Bei einer Vielzahl von Systemen ist die nächste Option die Verwendung find
.
find . -type d -exec echo '{}' \;
Hier find
ruft der Befehl echo
ein Argument des Dateinamens auf und übergibt ihm. Es macht dies einmal für jede gefundene Datei. Wie im vorherigen Beispiel gibt es keine Analyse einer Liste von Dateinamen. Stattdessen wird ein Fileneame vollständig als Argument gesendet.
Die Syntax des -exec
Arguments sieht etwas komisch aus. find
nimmt das erste Argument nach -exec
und behandelt es als auszuführendes Programm, und jedes nachfolgende Argument nimmt es als Argument an das Programm. Es gibt zwei besondere Argumente, -exec
die zu sehen sind. Der erste ist {}
; Dieses Argument wird durch einen Dateinamen ersetzt, den die vorherigen Teile von find
generieren. Die zweite ist ;
, die find
wissen lässt, dass dies das Ende der Liste der Argumente ist, die an das Programm übergeben werden sollen; find
benötigt dies, da Sie mit weiteren Argumenten fortfahren können, find
die für das ausgeführte Programm bestimmt sind und nicht für dieses Programm bestimmt sind. Der Grund für das \
ist, dass die Schale auch behandelt;
speziell - es stellt das Ende eines Befehls dar, also müssen wir es entziehen, so dass es von der Shell als Argument ausgegeben wird, find
anstatt es für sich selbst zu verbrauchen; Eine andere Möglichkeit, die Shell dazu zu bringen, sie nicht speziell zu behandeln, besteht darin, sie in Anführungszeichen zu setzen: ';'
funktioniert genauso gut wie \;
für diesen Zweck.