Ich versuche, mit Dateien nach Dateien zu suchen find
und diese Dateien in ein Bash-Array zu legen, damit ich andere Operationen an ihnen ausführen kann (z . B. ls
oder grep
sie). Aber ich kann nicht herausfinden, warum readarray
die find
Ausgabe nicht gelesen wird, wenn sie in sie geleitet wird.
Angenommen, ich habe zwei Dateien im aktuellen Verzeichnis file1.txt
und file2.txt
. Die find
Ausgabe ist also wie folgt:
$ find . -name "file*"
./file1.txt
./file2.txt
Also möchte ich das in ein Array leiten, dessen zwei Elemente die Zeichenfolgen sind "./file1.txt"
und "./file2.txt"
(natürlich ohne Anführungszeichen).
Ich habe dies unter anderem versucht:
$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"
0
Wie Sie der echo
Ausgabe entnehmen können, ist mein Array leer.
Was genau mache ich hier falsch? Warum wird die Ausgabe nicht als Standardeingabe readarray
gelesen find
und diese Zeichenfolgen in das Array eingefügt?
readarray -d '' < <(find your_args -print0)
Die richtige Lösung ist:
Das ähnelt dem, was Gregs BashFAQ 020 ausführlich erklärt, und diese Antwort behandelt .
Hat kein Problem mit ungeraden benannten Dateien (die kein NUL im Namen enthalten), mit Leerzeichen oder neuen Zeilen. Das Ergebnis wird in einem Array festgelegt, das für die weitere Verarbeitung nützlich ist.
quelle
readarray
kann auch von stdin lesenquelle
find -print0
zum Schutz vor "unerwarteten" Dateinamen.