Batch rinomina i file in minuscolo

16

C'è un modo per rinominare tutti i file in una directory in minuscolo | maiuscolo?

Sto cercando un comando oneliner .

Ho amato alt+f7 di TotalCommander, ora ho bisogno di quella funzionalità nel Terminale

    
posta Unamata Sanatarai 18.04.2013 - 14:36

3 risposte

20

Per ogni file a_file nella directory corrente rinomina a_file in lettere minuscole.

for a_file in *;do mv -v "$a_file" 'echo "$a_file" | tr [:upper:] [:lower:]' ;done;

In maiuscolo inverta gli argomenti a [:lower:] [:upper:]

tr comando riferimento link

Aggiorna

Per un controllo ancora maggiore, * può essere sostituito con ls .

Ad esempio in una directory contenente 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg e 3.jpg per filtrare solo i file * .jpg, ls può essere usato:

for a_file in $(ls *.jpg);do mv -v $a_file 'echo $a_file | tr [:upper:] [:lower:]' ;done;

Il codice sopra assegnerà a a_file variabile tutti i file con estensione .jpg.

Aggiornamento ha aggiunto l'opzione -v al comando mv come per sds suggerito.

    
risposta data Stef K 18.04.2013 - 14:57
16

C'è un'utilità più elegante e generale chiamata prename .

Scritto da Larry Wall, viene fornito con perl quindi è probabilmente già disponibile sul tuo sistema come /usr/bin/prename (se hai impostato le alternative potrebbe anche essere disponibile come /usr/bin/rename symlinked via / etc / alternative a prename )

Usandolo puoi rinominare più file in un comando fornendo qualsiasi espressione perl (inclusa, a titolo esemplificativo ma non esaustivo, sostituzione s/// o char transliteration tr/// ):

Esempi:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

E così via.

Un'altra cosa interessante di prename è che ti protegge, in caso di ridenominazione di un file in un nome di file esistente.

man prename per ulteriori dettagli.

    
risposta data arielf 20.04.2013 - 04:19
1

Uso di find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Per find

  • Ovviamente dopo -name inserisci il tuo pattern.
  • -maxdepth 0 : solo directory corrente.

Per rename

  • -n, -nono : Nessuna azione: stampa i nomi dei file da rinominare, ma non rinominare.
  • y/source/dest/ : traslitterazione dei caratteri nello spazio modello che appaiono in origine al carattere corrispondente in dest.
risposta data Pablo Bianchi 16.03.2017 - 03:27

Leggi altre domande sui tag