Mein Fotoimporter hat Dateien von meiner Kamera verschoben und umbenannt, aber ich habe vergessen anzugeben, dass die Dateierweiterung beibehalten werden soll. So habe ich mehrere Ordner mit Hunderten von JPG und AVI - Dateien , die alle fehlen ihre richtige Erweiterung.
Es gibt nicht so viele Videodateien, so dass ich sie entweder vor oder nach einer allgemeinen Massenumbenennung in JPG manuell umbenennen kann.
Um die Sache noch komplizierter zu machen, enthalten die Dateinamen Leerzeichen, daher kann ich das nicht, mv "*" "*.jpg"
weil das nicht funktioniert (aber genau das würde ich unter DOS / Windows tun).
Ich weiß, dass Linux voller mächtiger Befehle ist. Wie kann ich Dateien massenweise umbenennen, um eine JPG-Erweiterung hinzuzufügen, wenn diese Dateien Leerzeichen enthalten?
Bitte sagen Sie nicht "Verwenden Sie keine Leerzeichen", da ich wirklich nicht danach frage. Vielen Dank.
quelle
find /PATH/TO/FOLDER -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
(Quelle), wodurch alle Leerzeichen in Dateien und Ordnern und Unterordnern für Sie ersetzt werden.Antworten:
Shell Globs sollten auch mit Leerzeichen in den Namen funktionieren, wenn sie richtig verwendet werden, z
oder
[HINWEIS: Dies sind keine Operationen, bis der
n
Schalter oder dieecho
entfernt werden. Sie können also vor dem Festschreiben den korrekten Austausch überprüfen.]Wenn Sie automatisch zwischen JPG- und AVI-Dateien unterscheiden möchten, ist dies auch mit einer komplexeren Schleife und dem Befehl
file
oder möglichmimetype
quelle
rename
Sie verwenden. Dies ist diejenige, die mit Perl kommt , nicht die üblichere und weniger nützliche, die mit util-linux kommtrename
ist der Perl. Der vonutil-linux
ist/usr/bin/rename.ul
unter Ubuntu, während er/usr/bin/rename
standardmäßig ein Symlink zu ist/usr/bin/prename
. Im Allgemeinen ist es in der Debian-Welt (und dies ist Ask Ubuntu ) sicher anzunehmen,prename
sofern nicht anders angegeben.Wenn Sie eine komplexere Hierarchie haben, benötigen Sie einen etwas ausgefeilteren Ansatz. Sie können entweder die
globstar
Option von bash verwenden, mit der**
null oder mehr Verzeichnisse und Unterverzeichnisse abgeglichen werden können, oder Sie können verwendenfind
.Globstar
Die
[ -f "$f" ] &
sorgt dafür , dass dermv
Befehl nur auf Dateien und Verzeichnisse nicht ausgeführt wird.find
Die
-type f
garantiert , dass wir nur Dateien und keine Verzeichnisse und die findenprint0
Ursachenfind
seiner Ausgabe drucken getrennt mit dem Null - Zeichen (\0
) anstelle von Zeilenumbrüchen. Dies stellt sicher, dass wir korrekt mit Dateinamen umgehen, die Leerzeichen, Zeilenumbrüche oder andere Verrücktheiten enthalten.xargs
Nimmt eine Liste der Eingaben und führt den darauf angegebenen Befehl aus. Das-0
Flag weist es an, eine durch Null getrennte Eingabe zu erwarten, und das-I{}
ersetzt jede Instanz von{}
durch jeden der übergebenen Eingabedatensätze (in diesem Fall Dateien).quelle
find -name *.jpg -print0 | xargs -0 -I{} sh -c "printf \"'{}' \" && printf \"'{}\" | head -c-4 && printf \".JPG'\0\"" | xargs -0 -I{} sh -c "mv {}"
Ich würde Ihnen raten, ein Programm namens zu verwenden
pyrenamer
.Öffnen Sie es und geben Sie im Muster Umbenannter Dateiname ein
{1}.jpg
.quelle
Bitte lesen Sie,
man rename
bevor Sie dies versuchenDies sollte wie ein Zauber wirken.
In einem Terminal:
Bitte ändern Sie "jpg" auf das, was Sie brauchen.
rename
kann Perl-Ausdrücke verwenden .. Ihr bester FreundIn der ersten Zeile haben Sie Ihr Dateiverzeichnis eingegeben
Der
s
vorige Ausdruck zeigt eine Substitution anAnschließend wird nach einer Datei mit einem alphanumerischen Namen und einem Unterstrich gesucht, jedoch ohne Erweiterung
Und ersetzen Sie es. ein Punkt jpg
Schließlich auf jede Datei im Ordner der ersten Zeile anwenden
quelle
Diese Situation tritt bei der Verwaltung von Systemen häufig auf, insbesondere beim Umgang mit Dateinamen, die von Windows-Anwendungen erstellt wurden.
.jpg
Berücksichtigen Sie diese Befehlsliste, um Erweiterungen für Dateinamen ohne Erweiterung hinzuzufügen .find's
-print0
generiert NULL-Zeichen für Trennzeichen, xargs's-0
akzeptiert diese NULL-Trennzeichen. Dies gilt auch für alle Unterverzeichnisse. Ersetzen Sie daher unbedingt den Pfad './example'.rename
ist ein großartiger Befehl, aber sowohl in der Implementierung als auch in der Spezifikation distro-spezifisch. Ich benutzerename
normalerweise Dinge wie in der Kommandozeile, aber ich schreibe immer in GNU-Utils-Standards für meine Skripte.quelle