Batch-Umbenennung von Dateien (Bildern) basierend auf CSV-Dateien


11

Was ich habe und erreichen möchte:

  1. In einem Ordner befinden sich Tausende von Bildern.

  2. Ich habe eine CSV-Datei mit folgenden Spalten:

    A: ursprünglicher Name B: umbenannter Name

    Eine typische Zeile sieht folgendermaßen aus:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    Ich kann die Anführungszeichen entfernen, das ist kein Problem.

  3. Jetzt möchte ich eine App verwenden oder ein Skript ausführen, das nach allen Bildern in Spalte A sucht und sie in Namen in Spalte B umbenennt (z. B. original-1.jpg -> umbenannt-1.jpg).

Es gibt einige Antworten, zB:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Es sind jedoch einige Skripte erforderlich, und ich bin mir nicht sicher, ob alle diese Skripte nur den Ordner betreffen, in dem Sie das Skript speichern, oder ob sie alle Dateien auf der Festplatte umbenennen können, die bestimmte Bedingungen erfüllen. Letzteres muss natürlich vermieden werden.

Was ich suche, ist eine einfache Anleitung zum Umbenennen von Dateien und zum Auswählen eines Ordners mit Dateien.

Danke im Voraus.

Antworten:


13

Dies sollte für Sie funktionieren:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Erläuterung:

  • sed 's/"//g' files.csv : Entfernen Sie die Anführungszeichen
  • IFS=, : Teilen Sie den Eingang ein ,
  • while read orig new; do ... done: Dies liest jede Eingabezeile, teilt sie auf den Wert von $IFS(hier ein Komma) und speichert das 1. Feld als $origund den Rest als $new.
  • mv "$orig" "$new" : Dadurch werden die Dateien wie gewünscht umbenannt.

Wenn Ihre Datei nur Dateinamen (wie orig.jpg) und keine Pfade (nicht /home/take2/orig.jpgoder ähnlich) enthält, wirkt sich der obige Befehl nur auf Dateien in Ihrem aktuellen Verzeichnis aus. Sie müssen also ein Terminal cdim Zielverzeichnis öffnen und dort ausführen.

Zuerst testen:

Um dies zu testen, können Sie zuerst einen Probelauf durchführen, indem Sie die Befehle drucken, die ausgeführt werden, ohne sie tatsächlich auszuführen:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

Großartig, das wird besser erklärt. :) Nur um zu überprüfen, bevor es ausgeführt wird - Ich muss in das Zielverzeichnis cd und diese Zeile ausführen oder ich muss diese Zeile als example.sh speichern und dann "example.sh" vom Terminal ausführen?
Take2

@ take2 Sie können die Leitung einfach direkt ausführen. Ich habe die Antwort aktualisiert, um zu sehen, was ausgeführt wird, ohne Ihre Dateien tatsächlich zu ändern. Ich empfehle Ihnen, dies zuerst zu tun.
Terdon

Wunderbar, es funktioniert! Nur noch eine Sache - ist es egal, wie die Spalten beschriftet sind (sie sind im Moment "orig" und "neu") oder werden die Namen von Spalte A einfach in Namen von Spalte B umbenannt?
Take2

@ take2 welche etiketten? Nein, es wird nur das erste durch Kommas getrennte Feld verwendet und in das zweite umbenannt. Wenn mehr als zwei Felder vorhanden sind, wird es in den Rest der Zeile umbenannt. Solange Ihre Eingabedatei dem entspricht, was Sie veröffentlicht haben, funktioniert sie wie erwartet.
Terdon

Übrigens. Das Terminal zeigt auch "mv: kann nicht stat 'orig': Keine solche Datei oder kein solches Verzeichnis" an, obwohl es die Datei umbenannt hat.
Take2
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.