GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Alle Dateien in einem Verzeichnis löschen, dessen Name nicht mit einer Zeile in einer Dateiliste übereinstimmt?

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.


Linux
  1. So finden Sie eine Datei in Linux rekursiv in allen Verzeichnissen

  2. Wie öffnet oder listet man alle Dateien auf, deren Name mit zwei Mustern in Bash übereinstimmt?

  3. Alle Verzeichnisse auflisten, die keine Datei mit einem bestimmten Dateinamen enthalten?

  4. Verwenden Sie Suchen, um ein bestimmtes Verzeichnis zu finden und alle darin enthaltenen Dateien außer einem Verzeichnis zu löschen?

  5. Entfernen Sie einen symbolischen Link zu einem Verzeichnis

Wie lösche ich alle Dateien mit einer bestimmten Erweiterung in einem bestimmten Ordner?

Alle Dateien in einem Verzeichnis rekursiv auflisten, einschließlich Dateien in Symlink-Verzeichnissen

Entpacken Sie alle Dateien in einem Verzeichnis

Löschen Sie alle bis auf 1000 zufällige Dateien in einem Verzeichnis

Wie listet man alle Dateien auf, bei denen nur ein beliebiger Dateipfad gelesen wird, aber keine Verzeichnisliste oder sudo?

Wie kann ich alle Dateien aus einem Verzeichnis löschen, wenn die Argumentliste zu lang gemeldet wird?