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!' {} +