Entfernen bestimmter Sonderzeichen aus Dateinamen

Entfernen bestimmter Sonderzeichen aus Dateinamen

Ich habe ein Problem beim Übertragen von Ordnern auf meine externe Festplatte. Ich möchte die Formatierung der Festplatte nicht ändern.

Es befinden sich also Hunderte von Dateien im Ordner, und der Fehler, der mich daran hindert, sie zu kopieren, wird von Sonderzeichen verursacht (ich weiß nicht genau, welche, aber ich glaube, es sind „|“ und „.“ und ich bin sicher, es gibt noch andere). Ich habe diese manuell umbenannt/entfernt, aber es ist mühsam.

Ich bin offen für Vorschläge, aber ich „schätze“, dass ich nach einer Möglichkeit suche, diese speziellen Zeichen entweder aus dem Dateinamen zu entfernen (würde das ein Problem mit .m4a usw. verursachen?) oder sie bei Bedarf durch einen Unterstrich zu ersetzen. Die einzige Möglichkeit, die ich habe, ist die Umbenennung in Perl, aber das habe ich noch nicht ausprobiert.

'y/|/_/' * so umbenennen?

Danke für alle Vorschläge

Antwort1

Ja, der (Perl-basierte) renameBefehl ist hierfür gut geeignet. Sie können die Option -noder hinzufügen --nono, um die Ersetzungen probeweise auszuführen, z. B.:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

also zum Beispiel

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

renameBeachten Sie , dassnichtermöglicht das destruktive Überschreiben von Dateien, deren Namen nicht eindeutig sind:

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

Beachten Sie, .dassnichtein Sonderzeichen im Kontext von Dateinamen, daher würde ich vorschlagen, dies nicht wirklich zu ersetzen.

Antwort2

Eignet sich im Allgemeinen mmvhervorragend für Massenumbenennungsaufgaben.

Aber in diesem speziellen Fall würde ich einen völlig anderen Weg gehen: Ein Shell-Skript mit einigen Shell-Befehlen generieren, genau prüfen, ob es wirklich das ist, was ich will, und es dann ausführen.

Grobe Übersicht:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Qfügt um jeden Namen doppelte Anführungszeichen hinzu, d. h. Sie erhalten "foo*bar"oder "foo | bar".

Ersetzen Sie dann die unerwünschten Zeichen in /tmp/new.txtentweder manuell mit einem Editor oder durch sed -i -e(oder perl -p -i -ewenn Sie das bevorzugen) oder troder tr -d. Wichtig:Ändern Sie die Reihenfolge in dieser Datei nicht und löschen oder fügen Sie keine Zeilen hinzu!

Überlegen Sie sich auf jeden Fall genau, /tmp/new.txtob die neuen Namen wirklich Ihren Vorstellungen entsprechen.

Suchen Sie nach doppelten Namen! ( sort /tmp/new.txt | uniq -r) Stellen Sie sicher, dass keine Duplikate vorhanden sind, und bearbeiten Sie die Zeile ggf. manuell, um einen eindeutigen Namen zu erhalten.

Anschließend füge die Dateien mit dem pasteBefehl zusammen und ändere jede Zeile in einen mvBefehl:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

Dieser pasteBefehl nimmt eine Zeile aus /tmp/old.txtund eine Zeile aus /tmp/new.txtund fügt sie in einer einzigen Zeile mit einem Leerzeichen dazwischen zusammen. Der sedTeil fügt mv -nam Anfang jeder dieser Zeilen ein hinzu. mv -nverhindert das Überschreiben einer vorhandenen Datei.

Diese Datei enthält jetzt viele Zeilen wie

mv -n "foo" "bar"
mv -n "abc" "def"

Schauen Sie sich die Datei noch einmal an und führen Sie sie mit aus, wenn Sie sicher sind, dass es das ist, was Sie wollen sh /tmp/bulk-rename.

verwandte Informationen