Das rekursive Durchlaufen von Dateien in einem Verzeichnis kann auf einfache Weise erfolgen durch:
find . -type f -exec bar {} \;
Das oben Genannte funktioniert jedoch nicht für komplexere Dinge, bei denen viele bedingte Verzweigungen, Schleifen usw. ausgeführt werden müssen. Ich habe dies für die oben genannten verwendet:
while read line; do [...]; done < <(find . -type f)
Es sieht jedoch so aus, als ob dies nicht für Dateien funktioniert, die dunkle Zeichen enthalten:
$ touch $'a\nb'
$ find . -type f
./a?b
Gibt es eine Alternative, die solche dunklen Zeichen gut handhabt?
find ... -exec bash -c 'echo filename is in \$0: "$0"' {} \;
ist ein besserer Weg, es zu tun.read line
auf ändernIFS= read -r line
. Das einzige Zeichen, das es dann unterbricht, ist eine neue Zeile.-d $'\0'
ist vorzuziehen.Antworten:
Ein weiterer sicherer Zweck
find
:(Dies funktioniert mit jedem POSIX
find
, aber der Shell-Teil erfordert bash. Mit * BSD und GNU find können Sie-print0
stattdessen-exec printf '%s\0' {} +
etwas schneller arbeiten.)Dies ermöglicht die Verwendung der Standardeingabe innerhalb der Schleife und funktioniert mit jedem Pfad.
quelle
do echo "Filename is '$REPLY'"
Dies zu tun ist so einfach wie:
Oder...
quelle
Der einfachste (und dennoch sichere) Ansatz ist die Verwendung von Shell-Globbing:
Um die obige Rekursion in Unterverzeichnisse (in Bash) umzuwandeln, können Sie die
globstar
Option verwenden. Stellen Sie außerdem eindotglob
, dass Dateien gefunden werden, deren Name mit Folgendem beginnt.
:**/
Beachten Sie, dass bis Bash 4.2 symbolische Verknüpfungen zu Verzeichnissen erstellt werden. Seit Bash 4.3**/
rekursiv nur in Verzeichnisse, wiefind
.Eine andere gebräuchliche Lösung ist die Verwendung
find -print0
mitxargs -0
:Beachten Sie, dass das
h:/g
tatsächlich korrekt ist, da der Dateiname a enthält\r
.quelle
Es ist ein bisschen schwierig , Ihre Leseschleife portably zu tun, aber für bash insbesondere kann man so etwas versuchen dies .
Relevanter Teil:
Das weist
find
an, seine Ausgabe mit NUL-Zeichen (0x00) zu drucken undread
NUL-getrennte Zeilen (-d $'\0'
) abzurufen, ohne Backslashes als Escapezeichen für andere Zeichen (-r
) zu behandeln und keine Worttrennung in den Zeilen (IFS=
) vorzunehmen . Da 0x00 ein Byte ist, das in Dateinamen oder Pfaden in Unix nicht vorkommen kann, sollte dies alle Ihre seltsamen Dateinamenprobleme behandeln.quelle
-d ''
ist äquivalent zu-d $'\0'
.