Para o moderno bash
(que suporta a mudança de maiúsculas e minúsculas):
for dir in [A-Z][a-z]*/
do
mv -t "$dir" ${dir^^}/*
done
Em versões não suportadas, você pode usar a conversão tr
| sed
|….
Eu tenho várias pastas que contêm subpastas como jan / jan / FEB / fev / mar / mar / e assim por diante. Eu preciso mover todos os arquivos de JAN / * para Jan /, FEB / * para fevereiro / e assim por diante. Como faço para conseguir isso com um script de shell?
Editar
Obrigado ao @Costas por me apontar na direção certa. Sua solução funcionará com o Bash 4 e acima. Desde que eu tinha v3 acabei usando isso.
for DIR in [A-Z][A-Z]*/
do
NEWDIR='echo "$(echo "$DIR" | sed 's/.*/\L&/; s/[a-z]*/\u&/g')"'
mv $DIR/* $NEWDIR
done
script sed tirado de aqui .
Usando o utilitário rename
baseado em Perl que vem como padrão no Debian, mas é conhecido como prename
em alguns outros sistemas, você pode fazer isso com um comando
( LC_ALL=C; prename -v 's!^([A-Z])([A-Z]{2}/)!$1\L$2!' [A-Z][A-Z][A-Z]/* )
Isso força a C
locale, que garante que a correspondência de nomes de arquivos seja sensível a maiúsculas e minúsculas, permitindo que o padrão de arquivo [A-Z][A-Z][A-Z]
escolha somente meses com letras maiúsculas. A substituição troca três letras maiúsculas por uma letra maiúscula seguida por duas letras minúsculas.
Se preferir, você pode trocar o padrão de nome de arquivo [A-Z][A-Z][A-Z]/*
por uma lista explícita de todos os doze meses: {JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}/*
Tags shell shell-script