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?


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.


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`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.