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_filenella directory corrente rinominare a_filein 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:]
trlink 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, è lspossibile 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_filevariabile tutti i file con estensione .jpg.
Aggiornare aggiunto -vopzione di mvcomando come da sds suggerito.
C'è un'utilità più elegante e generale chiamata prename.
Scritto da Larry Wall, viene fornito in perlmodo 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/renamelink 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.
findfind . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find-namemesso 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.
mvmodo da vedere cosa viene fatto; potresti non voler passare "-f" perché questo potrebbe ostruire i file esistenti