C'è un modo per rinominare tutti i file in una directory in minuscolo | maiuscolo?
Sto cercando un comando oneliner .
Ho adorato TotalCommander alt+f7
, ora ho bisogno di quella funzionalità nel Terminale
C'è un modo per rinominare tutti i file in una directory in minuscolo | maiuscolo?
Sto cercando un comando oneliner .
Ho adorato TotalCommander alt+f7
, ora ho bisogno di quella funzionalità nel Terminale
Risposte:
Per ogni file a_file
nella directory corrente rinominare a_file
in minuscolo.
for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;
Per le maiuscole, invertire gli argomenti in [:lower:] [:upper:]
tr
link di riferimento del comando
Aggiornare
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
possibile utilizzare:
for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;
Il codice sopra assegnato assegnerà alla a_file
variabile tutti i file con estensione .jpg.
Aggiornare aggiunto -v
opzione di mv
comando come da sds suggerito.
C'è un'utilità più elegante e generale chiamata prename
.
Scritto da Larry Wall, viene fornito in perl
modo che sia molto probabilmente già disponibile sul tuo sistema poiché /usr/bin/prename
(se hai alternative di installazione potrebbe essere disponibile anche come /usr/bin/rename
link simbolico tramite / etc / alternatives a prename
)
Usandolo puoi rinominare più file in un comando fornendo qualsiasi espressione perl (incluso ma non limitato a sostituzione s///
o traslitterazione caratteri 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]+)/$1+3/e' *[0-9]*
# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}' *
E così via.
Un'altra cosa bella del nome è che ti protegge, nel caso di rinominare un file con un nome di file esistente.
man prename
per ulteriori dettagli.
find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find
-name
messo il tuo modello.-maxdepth 0
: Solo la directory corrente.rename
-n, -nono
: Nessuna azione: stampa i nomi dei file da rinominare, ma non rinominarli.y/source/dest/
: Traslittera i caratteri nello spazio del motivo che appaiono in origine al carattere corrispondente in dest.
mv
modo da vedere cosa viene fatto; potresti non voler passare "-f" perché questo potrebbe ostruire i file esistenti