find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Non ho provato gli script più elaborati menzionati qui, ma nessuna delle singole versioni a riga di comando ha funzionato per me sul mio Synology NAS. rename
non è disponibile e molte delle varianti di find
fail perché sembrano aderire al nome precedente del percorso già rinominato (ad esempio, se trova ./FOO
seguito da ./FOO/BAR
, la ridenominazione ./FOO
in ./foo
continuerà comunque a elencare./FOO/BAR
, anche se quel percorso non è più valida è) . Il comando sopra ha funzionato per me senza problemi.
Quella che segue è una spiegazione di ogni parte del comando:
find . -depth -name '*[A-Z]*'
Questo troverà qualsiasi file dalla directory corrente ( .
passa alla directory che vuoi elaborare), usando una ricerca approfondita (ad es., Elencherà ./foo/bar
prima ./foo
), ma solo per i file che contengono un carattere maiuscolo. Il -name
filtro si applica solo al nome del file di base, non al percorso completo. Quindi questo elencherà ./FOO/BAR
ma non ./FOO/bar
. Va bene, non vogliamo rinominare ./FOO/bar
. Vogliamo rinominare ./FOO
però, ma quello è elencato più avanti (ecco perché -depth
è importante).
Questo comando in sé è particolarmente utile per trovare i file che si desidera rinominare in primo luogo. Utilizzare questo dopo il comando di ridenominazione completo per cercare file che non sono stati ancora sostituiti a causa di collisioni o errori di nomi di file.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Questa parte legge i file generati da find
e li formatta in un mv
comando usando un'espressione regolare. L' -n
opzione interrompe la sed
stampa dell'input e il p
comando nel regex cerca e sostituisci restituisce il testo sostituito.
La regex stessa consiste di due acquisizioni: la parte fino all'ultima / (che è la directory del file) e il nome stesso. La directory viene lasciata intatta, ma il nome file viene trasformato in minuscolo. Quindi, se find
uscite ./FOO/BAR
, diventerà mv -n -v -T ./FOO/BAR ./FOO/bar
. L' -n
opzione mv
assicura che i file minuscoli esistenti non vengano sovrascritti. L' -v
opzione apporta in mv
output tutte le modifiche apportate (o non effettua - se ./FOO/bar
già esiste, genera qualcosa di simile ./FOO/BAR -> ./FOO/BAR
, rilevando che non è stata apportata alcuna modifica). Il -T
è molto importante - si tratta di file di destinazione come una directory. Questo farà in modo che ./FOO/BAR
non venga spostato ./FOO/bar
se esiste quella directory.
Usalo insieme a find
per generare un elenco di comandi che verranno eseguiti (utile per verificare cosa verrà fatto senza farlo effettivamente)
sh
Questo piuttosto autoesplicativo. Instrada tutti i mv
comandi generati all'interprete della shell. Puoi sostituirlo con bash
o con qualsiasi shell di tuo gradimento.
ABCdef
,abcDEF
eaBcDeF
? Lo script di rinomina dovrebbe interrompersi o semplicemente avvisare e continuare? 2. Come si definiscono le lettere minuscole per i nomi non US-ASCII? Se tali nomi potrebbero essere presenti, è necessario prima verificare e escludere il passaggio? 3. Se stai eseguendo un'operazione di ridenominazione