
Ich versuche, die Namen aller TXT-Dateien aus dem aktuellen Ordner in einer Zeile auszudrucken. Ich verwende das folgende Skript. Es werden jedoch keine Dateinamen gedruckt.
REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ+="${name} "
done
echo "Full Sequence: ${REF_SEQ}"
Ich habe 3-4 .txt-Dateien in meinem aktuellen Ordner (A.txt, B.txt ...). Ich erwarte die Ausgabe als
Vollständige Sequenz: A.txt B.txt ...
Wenn ich nur find
den Befehl verwende, ohne die Ausgabe der Variablen zuzuweisen RED_SEQ
, erhalte ich die gewünschte Ausgabe. Dies deutet darauf hin, dass der Befehl „find“ einwandfrei funktioniert, ich ihn aber irgendwie nicht der Variablen zuweisen kann. Ich habe verschiedene Zuweisungsoperatoren ausprobiert, aber immer noch kein Glück gehabt.
Antwort1
Um eine Variable in zu aktualisieren bash
, müssen Sie diese Syntax verwenden:
VAR="some stuff$VAR"
Da Sie jedoch eine Pipe verwenden, while
wird die Schleife in einer Unter-Shell ausgeführt und Ihre Variable geht verloren.
Um dies zu korrigieren, benötigen Sie die folgende Syntax:
while read f
do
done <<< $(input)
Also in Ihrem Fall:
REF_SEQ=""
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)
echo "Full Sequence: ${REF_SEQ}"
Antwort2
Das Problem ist, dass Sie {} hinter dem Pipe-Symbol verwenden. Dies ist nur in der Option -exec von find gültig, nicht aber hinter dem Pipe-Symbol.
Sie können Folgendes versuchen:
REF_SEQ=$(find . -maxdepth 1 -name "*.txt" -type f -printf "%f " | xargs)
Dies sollte das gewünschte Ergebnis liefern. Die printf-Direktive %f gibt den Basisnamen der gefundenen Datei aus und die xargs „transponieren“ das Ergebnis.
Liebe Grüße Jürgen