Wie führe ich einen Befehl für eine Liste von Dateinamen in einer Datei aus?

11

Ich habe die Namen der Dateien aufgelistet, die in eine Datei gelöscht werden sollen. Wie kann ich die Datei an den rmBefehl übergeben, damit sie einzeln gelöscht wird?

monu
quelle
1
Siehe FAQ 001 in Gregs Wiki ...
Jasonwryan

Antworten:

11

Wenn Sie eine Datei pro Zeile haben, können Sie dies folgendermaßen tun:

tr '\n' '\0' < list_of_files_to_be_deleted.txt | xargs -0 -r rm --

Die Dateiliste wird als Eingabe für den trBefehl angegeben, der das Dateitrennzeichen vom Zeilenvorschub in das Nullbyte ändert. Der xargsBefehl liest bei der Eingabe durch Nullbytes getrennte Dateien und startet den Befehl rm mit den als Argumente angehängten Dateien.

Jonas Berlin
quelle
1
Ich würde auch vorschlagen, rm --statt nur zu verwenden rm, damit Dateinamen, die mit einem Bindestrich beginnen, nicht als rmParameter behandelt werden.
Artyom
Es hat nicht funktioniert Kumpel ........ tr: extra Operand monu.txt' Try tr --help 'für weitere Informationen. rm: fehlender Operand Versuchen Sie `rm --help 'für weitere Informationen. ........ Das ist alles was ich sehen kann
monu
1
Haben Sie vielleicht das <vor dem Dateinamen verpasst?
Jonas Berlin
Ich habe den Befehl xargs ebenfalls ein wenig verbessert - hinzugefügt - gemäß dem Vorschlag von @artyom und -r hinzugefügt, um sicherzustellen, dass rm nicht ausgeführt wird, wenn keine zu entfernenden Dateien vorhanden sind.
Jonas Berlin
5

Die obige Antwort ist insofern in Ordnung, als es sehr schwierig ist, Dateinamen mit Leerzeichen und "seltsamen Zeichen" zu behandeln. Aber der einfachste Weg, wenn die Dateinamen vernünftig sind, ist nur (Warnung, Bashismus!):

rm $(< /the/file/with/names)

Für reguläre Shell:

rm `cat /the/file/with/names`
vonbrand
quelle