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.
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.csv
and übernimmt
cat foo.csv |
Dadurch wird der gesamte Inhalt der CSV-Datei ausgegeben und an den nächsten Befehl weitergeleitetawk '{gsub(",","\n"); print $0}
Diese Zeile übernimmt die Ausgabe des vorherigen Befehls und awk
ersetzt dann mithilfe des Textverarbeitungsprogramms das Komma ( ,
) für das Zeilenumbruchzeichen ( \n
). Anschließend wird jedes Element ( print $0
) in einer separaten Zeile ausgegebenrm $file
do
. (zB do mv $file ~/Foo/Bar/$file
um es in einen anderen Ordner zu verschieben.)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/folder
durch den Pfad zum enthaltenden Ordner der Bilder.
tr , '\n'
ersetzt Kommas in der Eingabe durch neue Zeilen. xargs
nimmt die Zeilen und führt den angegebenen Befehl für jede Zeile aus, wobei er {}
durch jede Zeileneingabe ersetzt wird (wie von angewiesen -I{}
). tr
wird verwendet, da xargs
in macOS kein -d
benutzerdefiniertes 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
Benutzer3439894
cat
and|
as wird die Datei als Argumentawk
lesen , d. h. , ist alles, was erforderlich ist."$(awk '{gsub(/,/, "\n")}1' foo.csv)"
Allan
awk
und sie mit meinem Codierungsstil übereinstimmt. Nichts davon ist "unnötig".Benutzer3439894
awk
es vielleicht nicht oft verwenden und obwohl meinawk
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.Allan