Come faccio a rinominare tutti i file in minuscolo?


123

Ho per esempio TREE.wav, ONE.WAV. Voglio rinominarlo in tree.wav, one.wav. Come faccio a rinominare tutti i file in minuscolo?


1
Ti senti a tuo agio con una soluzione Terminal / shell? O vuoi che il codice C / Objective-C lo faccia?

La soluzione terminale sarà ok.
Voloda2

3
Penso che questo dovrebbe essere riaperto. anche il codice del terminale è codice
Danield

1
Questa dovrebbe essere una domanda valida su stackoverflow. Anche questo è codice.
adev

Risposte:


371

Se sei a tuo agio con il terminale:

  1. Apri Terminal.app, digita cde quindi trascina nella finestra la cartella contenente i file da rinominare.
  2. Per confermare di essere nella directory corretta, digita lse premi invio.
  3. Incolla questo codice e premi invio:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Per confermare che tutti i tuoi file siano in minuscolo, digita lse premi di nuovo Invio.

(Grazie a @bavarious su Twitter per alcune correzioni e grazie a John Whitley di seguito per aver reso questo più sicuro su filesystem senza distinzione tra maiuscole e minuscole.)


9
Stai attento. Se si dispone di file denominati foo.txte FOO.TXT, questo potrebbe bloccarne uno.
Keith Thompson

1
Con bash, puoi semplicemente fare mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
:,

2
ho provato tutti questi comandi, ottengo "mv: 'PPP.txt' e 'ppp.txt' sono lo stesso file" e il mio file non è minuscolo ... qualche idea? È perché si trova nella stessa directory?
lorless

1
user2066039: Deve essere una cosa recente sul Mac, perché la maggior parte delle risposte più vecchie di un anno non ne tiene conto. Ho portato a termine l'operazione utilizzando un'estensione intermedia come "jpg1". Quindi, JPG -> jpg1 -> jpg. Spero che aiuti.
Joyce

14
Gli utenti di OS X dovrebbero prima rinominare ogni file con un nome temporaneo a causa del filesystem senza distinzione tra maiuscole e minuscole, ad esempio: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley

10

La domanda così formulata è generale e anche importante, quindi desidero fornire una risposta più generale:

Caso più semplice (sicuro la maggior parte del tempo e su Mac OS X, ma continua a leggere):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

È necessario gestire anche gli spazi nei nomi dei file (qualsiasi sistema operativo):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

È necessario gestire in modo sicuro i nomi di file che differiscono solo per maiuscole e minuscole in un file system sensibile al maiuscolo / minuscolo e non sovrascrivere il target (ad esempio Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Nota su Mac OS X:

Il filesystem del Mac non fa distinzione tra maiuscole e minuscole, preservando le maiuscole e le minuscole.

Tuttavia, non è necessario creare file temporanei, come suggerito nella risposta e nei commenti accettati, perché in primo luogo non possono esistere due nomi di file che differiscono solo per caso, rif .

Per mostrare questo:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Sì, ma il tuo esempio suggerisce che puoi usare nomi di file in minuscolo usando "mv X ​​x". Quindi è stato solo quello che ho commentato.
cpaludan

mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 Jun 24 15:19 X # mv X x mv: 'X' e 'x' sono la stessa cosa file # ls -la -rw-r - r-- 1 root root 0 24 giugno 15:19 X
cpaludan

Ci scusiamo per la pessima formattazione. COSÌ non è stato gentile con me lì.
cpaludan

1
E il mio male - era in un ssh sul mio lampone su un disco condiviso (formattato hfsplus) - lì non funziona. Ma localmente sul mio Mac lo fa.
cpaludan

for i in *; do j = $ (tr '[: upper:]' '[: lower:]' <<< "$ i"); mv "$ i" "$ j"; ha lavorato per me in catalina. Grazie.
Sinan Eldem

2

Una versione a conchiglia:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
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.