
Ich habe Dateinamen in einer Datei, die ich in einem anderen Verzeichnis löschen muss.
Angenommen, ich habe x
Dateien y
im Verzeichnis a
. Wie lösche ich sie mit cat?
Ich habe es versucht,
rm -f a/{`cat a.txt`}
a.txt
hat Inhalt x,y,z
.
Wenn sie im selben Ordner sind, kann ich sie einfügen x y z
und a.txt
ausfü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/z
die Datei einfügen, was eine Option sein kann, da festgelegt ist, dass sie a
nur die Dateien enthält. a
Sollte 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 -a
es angesichts der Funktion einSinnloser Einsatz von Cat)
Beachten Sie, dass dies -I{}
bedeutet, -L 1
dass ie rm
einmal 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. -I
In diesem Fall xargs
werden mehrere Argumente an übergeben rm
. In diesem Fall sollten Sie das Eingabetrennzeichen jedoch explizit auf „Newline“ setzen, xargs -a a.txt -d '\n' rm
um 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 cd
davor 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 xargs
NUL-getrennte Dateinamen verwenden.