Ich habe ein Verzeichnis mit über 1000 Dateien. In einer Textdatei habe ich ungefähr 50 Dateinamen, einen pro Zeile. Ich möchte alle Dateien im Verzeichnis löschen, deren Dateinamen keinem Eintrag in der Liste entsprechen. Was ist der beste Weg, dies zu tun? Ich habe ein Shell-Skript gestartet, konnte aber nicht den richtigen Befehl ermitteln, um festzustellen, ob der Dateiname auf der Liste steht. Danke.
Akzeptierte Antwort:
Mir ist klar, dass jede Frage, wie man Dateien löscht, mit großer Sorgfalt beantwortet werden muss.
Meine erste Antwort war zu voreilig, ich habe nicht angenommen, dass die Dateiliste für die Verwendung mit egrep fehlerhaft sein könnte. Ich habe die Antwort bearbeitet, um dieses Risiko zu verringern.
Das sollte für die Dateien funktionieren, die kein Leerzeichen im Namen haben:
Erstellen Sie zuerst Ihre Dateiliste neu, um sicherzustellen, dass sie mit dem genauen Dateinamen übereinstimmt:
sed -e 's,^,^,' -e 's,$,$,' filelist > newfilelist
Erstellen Sie die rm-Befehle
cd your_directory
ls | egrep -vf newfilelist | xargs -n 1 echo rm > rmscript
Überprüfen Sie, ob das rm-Skript zu Ihnen passt (Sie können es mit „vim“ oder „less“ tun).
Führen Sie dann die Aktion aus:
sh -x rmscript
Wenn die Dateien Leerzeichen in ihrem Namen haben (wenn die Dateien den "
im Namen dann funktioniert das nicht) :
ls | egrep -vf newfilelist | sed 's,^(.*)$,rm "1",' > rmscript
natürlich sollte die Dateiliste nicht im selben Verzeichnis liegen!
BEARBEITET:
Die Dateiliste von Nathan enthielt Namen, die mit allen Dateien im Verzeichnis übereinstimmten (wie „html“ passt zu „bob.html“). Es wurde also nichts gelöscht, weil egrep -vf
nahm den ganzen Strom auf. Ich habe einen Befehl hinzugefügt, um jeden Dateinamen mit einem „^“ und einem „$“ zu versehen. Ich hatte hier Glück, dass Nathans Dateiliste korrekt war. Wäre es mit CR-LF endenden Zeilen oder mit zusätzlichen Leerzeichen DOS-formatiert gewesen, wären keine Dateien von egrep erhalten geblieben und alle gelöscht worden.