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?


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.


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.


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

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

0

Wenn die Dateinamen keine Leerzeichen enthalten:

for f in *.JPG; do mv $f `echo $f | sed 's/JPG$/jpg/'`; done

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
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.