Voglio mettere in minuscolo il nome di ogni directory in una directory. Con quali comandi posso farlo?
Risposta accettata:
Tutte le directory a un livello o ricorsivamente?
Zsh
A un livello:
autoload zmv
zmv -o-i -Q 'root/(*)(/)' 'root/${1:l}'
Ricorsivamente:
zmv -o-i -Q 'root/(**/)(*)(/)' 'root/$1${2:l}'
Spiegazioni:zmv rinomina i file che corrispondono a un modello in base al testo sostitutivo specificato. -o-i passa il -i opzione per ogni mv comando sotto il cofano (vedi sotto). Nel testo sostitutivo, $1 , $2 , ecc, sono i gruppi successivi tra parentesi nel modello. ** significa tutte le (sotto)*directory, ricorsivamente. Il (/) finale non è un gruppo tra parentesi ma un qualificatore glob che significa abbinare solo le directory. ${2:l} converte $2 in minuscolo.
Portatile
A un livello:
for x in root/*/; do mv -i "$x" "$(printf %s "$x" | tr '[:upper:]' '[:lower:]')"; done
Il / finale limita la corrispondenza alle directory e mv -i fa chiedere conferma in caso di collisione. Rimuovere il -i per sovrascrivere in caso di collisione e utilizzare yes n | for … . per non essere richiesto e non eseguire alcuna ridenominazione che potrebbe entrare in conflitto.
Ricorsivamente:
find root/* -depth -type d -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} ;
L'uso di -depth assicura che le directory profondamente nidificate vengano elaborate prima dei loro predecessori. L'elaborazione del nome si basa sulla presenza di un /; se vuoi chiamare opera nella rubrica corrente, usa ./* (adattando lo script della shell per far fronte a . o * è lasciato come esercizio al lettore).
Rinomina Perl
Qui utilizzo lo script di ridenominazione Perl che Debian e Ubuntu forniscono come /usr/bin/prename (di solito disponibile come rename anche). A un livello:
rename 's!/([^/]*/?)$!L/$1!' root/*/
Ricorsivamente, con bash ≥4 o zsh:
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!L/$1!' root/**/*/
In modo ricorsivo, portatile:
find root -depth -type d -exec rename -n 's!/([^/]*/?)$!L/$1!' {} +