Script shell para mover arquivos entre dois diretórios

3

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 .

    
por Gh0sT 16.09.2015 / 09:56

2 respostas

6

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 |….

    
por 16.09.2015 / 10:42
4

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}/*

    
por 16.09.2015 / 10:31