Entfernen Sie alle Dateien, die mit dem Namen in einer Liste übereinstimmen

Ich habe einen Ordner mit vielen Bildern.

Mein Kunde hat mir eine Liste mit abgelehnten Bildern geschickt, die ich aus diesem Ordner löschen muss.

Die Liste sieht so aus: _001,_002,_003,_004,_006,_007,RAM08953,RAM08995,RAM08996,RAM09039,RAM09060,RAM09087,RAM09101,RAM09104,RAM09115,RAM09126,RAM09170,RAM09171,RAM09172,RAM09176,RAM09188.

Wie kann ich einfach etwas ausführen, das diese Dateien löscht, oder diese Dateien in einen neuen Ordner oder etwas verschieben, ohne es von Hand zu tun? Es kann eine App, ein Shell-Skript oder ein beliebiger Tipp sein.

Antworten (2)

Sie können eine Liste von durch Kommas getrennten Dateinamen mithilfe einer CSV-Datei löschen, indem Sie den folgenden Befehl verwenden:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do rm $file; done

Sie können es sicherer machen, indem Sie die Datei in den Papierkorb verschieben, anstatt sie zu löschen:

for file in $( cat foo.csv | awk '{gsub(",","\n"); print $0}' ); do mv $file ~/.Trash; done

Wie das funktioniert

Dies ist eine FOR/DO-Schleife, die zuerst den Inhalt von foo.csvand übernimmt

  • cat foo.csv |Dadurch wird der gesamte Inhalt der CSV-Datei ausgegeben und an den nächsten Befehl weitergeleitet
  • awk '{gsub(",","\n"); print $0}Diese Zeile übernimmt die Ausgabe des vorherigen Befehls und awkersetzt dann mithilfe des Textverarbeitungsprogramms das Komma ( ,) für das Zeilenumbruchzeichen ( \n). Anschließend wird jedes Element ( print $0) in einer separaten Zeile ausgegeben
  • Jede Zeile wird zu einem "Element" für die zu durchlaufende FOR-Schleife.
  • für jedes Element wird es den Befehl ausgebenrm $file
  • Sie können jede Datei löschen/verschieben/umbenennen/was auch immer, indem Sie den Befehl nach ändern do. (zB do mv $file ~/Foo/Bar/$fileum es in einen anderen Ordner zu verschieben.)
Die unnötige Verwendung von catand |as wird die Datei als Argumentawk lesen , d. h. , ist alles, was erforderlich ist. "$(awk '{gsub(/,/, "\n")}1' foo.csv)"
@ user3439894 - Ok ... deine ist kürzer und effizienter, aber ich mag meine Methode, da ich sie nur einmal in einem blauen Mond verwende awkund sie mit meinem Codierungsstil übereinstimmt. Nichts davon ist "unnötig".
Sie sagten: " Es ist nichts "unnötig" daran. " Nun, die Verwendung eines unnötigen externen Befehls und einer Pipe, wenn sie überhaupt nicht benötigt werden, ist in der Tat unnötig! Ich meine sicherlich nichts abwertend mit dem, was ich gesagt habe, und obwohl Sie awkes vielleicht nicht oft verwenden und obwohl mein awk Befehl kompakter ist, war dies dennoch nicht der Hauptpunkt, der angesprochen wurde. Ich weise nur darauf hin, was allgemein als ein sehr schlechtes Programmierparadigma angesehen wird. FWIW Auch ich programmiere auf die gleiche schlechte Weise, habe aber durch Kommentare wie diese gelernt, es besser zu machen.
Punkt genommen. Erlauben Sie mir, eines mit Ihnen zu teilen ... Ihre "Kritik" mit dem Wort "unnötig" zu beginnen, ist abwertend.

Um eine Liste von durch Kommas getrennten Dateinamen aus einem Ordner zu löschen, können Sie Folgendes verwenden:

tr , '\n' <<< "file.jpg,second.jpg,…" | xargs -I{} rm /path/to/folder/{}

Ersetzen Sie file.jpg,second.jpg,…durch Ihre kommagetrennte Liste von Dateien.
Ersetzen Sie /path/to/folderdurch den Pfad zum enthaltenden Ordner der Bilder.

tr , '\n'ersetzt Kommas in der Eingabe durch neue Zeilen. xargsnimmt die Zeilen und führt den angegebenen Befehl für jede Zeile aus, wobei er {}durch jede Zeileneingabe ersetzt wird (wie von angewiesen -I{}). trwird verwendet, da xargsin macOS kein -dbenutzerdefiniertes Trennzeichen unterstützt wird.

Mir ist jedoch aufgefallen, dass Ihre Liste keine Dateierweiterungen enthält. Sie können die Erweiterung stattdessen am Ende des Befehls hinzufügen.

tr , '\n' <<< "file,second,…" | xargs -I{} rm /path/to/folder/{}.jpg