Cat-Ausgabe an rm übergeben

Cat-Ausgabe an rm übergeben

Ich habe Dateinamen in einer Datei, die ich in einem anderen Verzeichnis löschen muss.

Angenommen, ich habe xDateien yim Verzeichnis a. Wie lösche ich sie mit cat?

Ich habe es versucht,

rm -f a/{`cat a.txt`}

a.txthat Inhalt x,y,z.

Wenn sie im selben Ordner sind, kann ich sie einfügen x y zund a.txtausführen.

rm -f `cat a.txt`

was gut funktioniert.

Ich habe auch versucht,

rm -f "a/{"`cat a.txt`"}"

Dieser Befehl wird in eine Docker-Datei eingefügt, daher möchte ich auch keine Variablen verwenden.

ICHnichtmöchte a/x a/y a/zdie Datei einfügen, was eine Option sein kann, da festgelegt ist, dass sie anur die Dateien enthält. aSollte aber nur in der Docker-Datei geändert werden. Vielen Dank für alle Vorschläge im Voraus :)

Antwort1

Sie sollten eine while-Schleife verwenden, um die Datei Zeile für Zeile zu lesen und dann jede Zeile auf anzuwenden rm. Dies ist ein sehr gängiger und häufig verwendeter Ansatz beim Scripting.

while IFS= read -r line
do
       rm a/"$line"
done < file.txt

Natürlich sollte das Format der Datei eine Liste von Dateien mit einer Datei pro Zeile sein

Antwort2

Versuchen Sie nicht, es $(cat file)für solche Dinge zu verwenden - es wird zum Beispiel abstürzen, wenn es Leerzeichen in Dateinamen gibt, wie z. B. gegeben

$ cat a.txt 
foo
bar baz
bam

Und

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"

Dann

$ (cd a ; rm $(cat ../a.txt))
rm: cannot remove 'bar': No such file or directory
rm: cannot remove 'baz': No such file or directory

Stattdessen können Sie verwendenxargs

$ ls -Q a
"bam"  "bar baz"  "foo"  "other file"  "somefile"
$ xargs -a a.txt -I{} rm a/{}
$ ls -Q a
"other file"  "somefile"

Wenn duWirklichverwenden möchtest cat, dann kombiniere es mit xargs:

cat a.txt | xargs -I{} rm a/{}

(obwohl -aes angesichts der Funktion einSinnloser Einsatz von Cat)


Beachten Sie, dass dies -I{}bedeutet, -L 1dass ie rmeinmal für jede Zeile der Eingabedatei aufgerufen wird. Wenn Sie keinen Verzeichnispfad voranstellen müssen, können Sie den Befehl effizienter gestalten, indem Sie das weglassen. -IIn diesem Fall xargswerden mehrere Argumente an übergeben rm. In diesem Fall sollten Sie das Eingabetrennzeichen jedoch explizit auf „Newline“ setzen, xargs -a a.txt -d '\n' rmum Umbrüche bei Leerzeichen zu vermeiden.

Antwort3

Vorausgesetzt, Ihre Dateinamen enthalten keine Leerzeichen oder Sonderzeichen, verwenden Sie einfach Ihren ursprünglichen Befehl erneut und setzen Sie cddavor ein:

(cd a; rm -f $(cat a.txt))

Beachten Sie, dass rm -f `cat a.txt`Leerzeichen oder andere Sonderzeichen in Dateinamen leicht zu Unterbrechungen führen können. Sie sollten wirklich xargsNUL-getrennte Dateinamen verwenden.

verwandte Informationen