Geben Sie allen Dateien die Erweiterung .jpg

8

Ich habe ein Verzeichnis und einige der Dateierweiterungen sind in Großbuchstaben (.JPG) statt in Kleinbuchstaben.

Ich möchte sicherstellen, dass jede Datei .jpg als Erweiterung hat. Wie würde ich dies an einer Shell-Eingabeaufforderung tun?

Mark Flint
quelle
Es ist eine Schande, dass Linux kein AppleScript hat.
Gadgetmo
2
Es ist so toll, dass Linux kein AppleScript hat.
Mathe

Antworten:

15

Verwenden der Shell-Parametererweiterung :

for f in *.JPG; do
    mv "${f}" "${f%%.JPG}.jpg"
done

Die "Charaktere kümmern sich um Dateinamen, die Leerzeichen enthalten, wie dies bei Fotos häufig der Fall ist.

Johnsyweb
quelle
5
+1 Diese Lösung funktioniert auch, wenn der Dateiname Leerzeichen enthält, Sie aber "$ f" anstelle von "f" meinen.
Adam Zalcman
Die Shell-Parametererweiterung ist etwas kryptisch, man könnte stattdessen den Basisnamen verwenden: für f in * .JPG; mache mv "$ f" "` basename $ f .JPG`.jpg "; fertig
Mathe
@math: Ich bevorzuge meine Version, da sie mit Dateinamen funktioniert, die Leerzeichen enthalten, und auch mit /path/to/*.JPG. Sie können natürlich gerne Ihre eigene Antwort einreichen :)
Johnsyweb
Natürlich entfernt der Basisname die führenden Verzeichnisse, funktioniert aber mit Leerzeichen innerhalb der Dateinamen. (Ich denke nicht, dass dies eine Antwort wert ist;) also habe ich es als Kommentar gepostet)
Mathe
10

Wenn Sie externe Tools verwenden können (nicht nur Bash), überprüfen Sie den renameBefehl!

rename .JPG .jpg *

Das renameist ein Teil von util-linux.

uzsolt
quelle
Umbenennen ist ... problematisch. Es gibt eine Version der Umbenennung, perldie verschiedene Argumente akzeptiert, um dasselbe zu tun.
Cha0site
Könnten Sie etwas mehr erklären? Welche Version übrigens?
Mathe
3

Wenn Sie Leerzeichen in Dateinamen haben:

for f in *.JPG; do [[ -f "${f}" ]] && mv "${f}" "${f/%JPG/jpg}"; done
cha0site
quelle
2

Ich würde vorschlagen, einen Blick auf den mmvBefehl zu werfen . Es ist genau für diese Art von Aufgaben geeignet. In Ihrem Szenario wäre es:

#> mmv "*.JPG" "#1.jpg"

Die Manpage ist voller Beispiele, daher dauert es keine Zeit, sich daran zu gewöhnen.

Auf Debian- Systemen kann es installiert werden mit:

#> aptitude install mmv
Alessandro Dotti Contra
quelle
0

Wenn die Dateinamen keine Leerzeichen enthalten:

for f in *.JPG; do mv $f `echo $f | sed 's/JPG$/jpg/'`; done
Karoly Horvath
quelle
1
Es wäre einfach genug, dies für Dateien mit Leerzeichen im Namen zu tun: Fügen Sie einfach doppelte Anführungszeichen um beide Argumente hinzu mv.
Adam Zalcman
Ich habe keine Leerzeichen. Was füge ich hinzu, um dies im CURRENT-Verzeichnis zu erreichen? Im Moment erhalte ich eine Fehlermeldung - mv: kann nicht angeben `* .JPG ': Keine solche Datei oder kein solches Verzeichnis
Mark Flint
1
Sie haben dort keine JPGs.
Karoly Horvath