Assegna a tutti i file un'estensione .jpg


8

Ho una directory e alcune estensioni dei file sono in maiuscolo (.JPG) invece che in minuscolo.

Voglio assicurarmi che ogni file abbia .jpg come estensione. Come lo farei da un prompt della shell?


È un peccato che Linux non abbia AppleScript.
gadgetmo,

2
È così bello che Linux non ha AppleScript.
matematica

Risposte:


15

Utilizzando l' espansione dei parametri della shell :

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

I "personaggi si prenderanno cura dei nomi dei file contenenti spazi, come spesso fanno le fotografie.


5
+1 Questa soluzione funziona anche se hai spazi nel nome file, ma intendi "$ f" invece di "f".
Adam Zalcman,

Shell Parameter Expansion è un po 'enigmatico, si potrebbe usare invece basename: for f in * .JPG; do mv "$ f" "` basename $ f .JPG`.jpg "; fatto
matematica

@math: preferisco la mia versione in quanto funziona con nomi di file contenenti spazi bianchi e funziona anche con /path/to/*.JPG. Puoi inviare la tua risposta, ovviamente :)
Johnsyweb,

Naturalmente basename rimuoverà le directory principali ma funzionerà con spazi all'interno dei nomi dei file. (Non credo che valga la pena rispondere;) quindi l'ho pubblicato come commento)
matematica

10

Se puoi usare strumenti esterni (non solo bash), controlla il renamecomando!

rename .JPG .jpg *

Fa renameparte di util-linux.


rinominare è ... problematico. Esiste una versione di rinomina che perlaccetta diversi argomenti per fare la stessa cosa.
cha0site,

Potresti spiegare qualcosa in più? Quale versione BTW?
matematica

3

Se hai spazi nei nomi dei file:

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

2

Vorrei suggerire di dare un'occhiata al mmvcomando. È adatto esattamente per questo tipo di attività. Nel tuo scenario sarebbe:

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

La pagina man è piena di esempi, quindi non ci vuole tempo per abituarsi.

Sui sistemi Debian può essere installato con:

#> aptitude install mmv

0

se non hai spazi nei nomi dei file:

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

1
Sarebbe abbastanza facile farlo funzionare per i file con spazi nel nome: basta aggiungere doppie virgolette attorno ad entrambi gli argomenti mv.
Adam Zalcman,

Non ho spazi. Cosa aggiungo per farlo accadere nella directory CORRENTE. Al momento ricevo l'errore - mv: impossibile stat `* .JPG ': nessun file o directory simile
Mark Flint

1
non hai JPG lì.
Karoly Horvath,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.