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. renamenon è disponibile e molte delle varianti di findfail perché sembrano aderire al nome precedente del percorso già rinominato (ad esempio, se trova ./FOOseguito da ./FOO/BAR, la ridenominazione ./FOOin ./foocontinuerà 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/barprima ./foo), ma solo per i file che contengono un carattere maiuscolo. Il -namefiltro si applica solo al nome del file di base, non al percorso completo. Quindi questo elencherà ./FOO/BARma non ./FOO/bar. Va bene, non vogliamo rinominare ./FOO/bar. Vogliamo rinominare ./FOOperò, 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 finde li formatta in un mvcomando usando un'espressione regolare. L' -nopzione interrompe la sedstampa dell'input e il pcomando 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 finduscite ./FOO/BAR, diventerà mv -n -v -T ./FOO/BAR ./FOO/bar. L' -nopzione mvassicura che i file minuscoli esistenti non vengano sovrascritti. L' -vopzione apporta in mvoutput tutte le modifiche apportate (o non effettua - se ./FOO/bargià 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/BARnon venga spostato ./FOO/barse esiste quella directory.
Usalo insieme a findper generare un elenco di comandi che verranno eseguiti (utile per verificare cosa verrà fatto senza farlo effettivamente)
sh
Questo piuttosto autoesplicativo. Instrada tutti i mvcomandi generati all'interprete della shell. Puoi sostituirlo con basho con qualsiasi shell di tuo gradimento.
ABCdef,abcDEFeaBcDeF? 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