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) rename
Befehl ist hierfür gut geeignet. Sie können die Option -n
oder 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)
rename
Beachten 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 mmv
hervorragend 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 -Q
fü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.txt
entweder manuell mit einem Editor oder durch sed -i -e
(oder perl -p -i -e
wenn Sie das bevorzugen) oder tr
oder 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.txt
ob 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 paste
Befehl zusammen und ändere jede Zeile in einen mv
Befehl:
paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename
Dieser paste
Befehl nimmt eine Zeile aus /tmp/old.txt
und eine Zeile aus /tmp/new.txt
und fügt sie in einer einzigen Zeile mit einem Leerzeichen dazwischen zusammen. Der sed
Teil fügt mv -n
am Anfang jeder dieser Zeilen ein hinzu. mv -n
verhindert 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
.