Renomear arquivos faz o nome da pasta em árvore no terminal, shell mac ou shell linux

1

Estou trabalhando com uma árvore de pastas e arquivos com a estrutura

  • \ Histórias \ 00 \ 0 \ 00000 \ temp.xxx
  • \ Histórias \ 00 \ 0 \ 00001 \ temp.xxx
  • ...
  • \ Histórico \ 10 \ 5 \ 10552 \ temp.xxx
  • \ Histórico \ 10 \ 5 \ 10553 \ temp.xxx
  • ...
  • \ Histórico \ 45 \ 9 \ 45998 \ temp.xxx
  • \ Histórico \ 45 \ 9 \ 45999 \ temp.xxx

O que eu preciso é renomear os arquivos para que temp.xxx seja alterado para um nome de arquivo seqüenciado, conforme mostrado abaixo:

  • \ Histórias \ 00 \ 0 \ 00000 \ 00000.xxx
  • \ Histórias \ 00 \ 0 \ 00001 \ 00001.xxx
  • ...
  • \ Histórico \ 10 \ 5 \ 10552 \ 10552.xxx
  • \ Histórico \ 10 \ 5 \ 10553 \ 10553.xxx
  • ...
  • \ Histórico \ 45 \ 9 \ 45998 \ 45998.xxx
  • \ Histórico \ 45 \ 9 \ 45999 \ 45999.xxx
por Alejandro O'Byrne 17.12.2014 / 14:51

2 respostas

0

Se sua estrutura é uniforme e você tem a profundidade de 3 dentro de sua pasta Histórico, talvez a maneira intuitiva seja ter aninhado loops e então usar o mv para renomear.

O código a seguir assume que você tem um arquivo em cada pasta na camada 3 e seu / Histórico não contém nada além de diretórios.

for layer1 in /History/*; do
    for layer2 in /History/$layer1/*; do
        for layer3 in /History/$layer1/$layer2/*; do
           for files in /History/$layer1/$layer2/$layer3/*; do
                mv files $layer3.xxx
            done
        done
    done
done

talvez esses dois links também sejam úteis:

link

link

    
por 17.12.2014 / 16:02
0

Você pode fazer isso com um comando assim:

find . -name "temp*" | sed -E 's|(.*)\/(.*)\/temp(.[a-z]{3})|mv & \/\/|g' | source /dev/stdin

Explicação passo a passo.

Esta é a sua entrada de amostra:

$ find . -name "temp*"
./History/10/5/10552/temp.xxx
./History/10/5/10553/temp.xxx
./Stories/00/0/00000/temp.xxx
./Stories/00/0/00001/temp.xxx

Eu ajustei a saída para se adequar ao resultado necessário.

$ find . -name "temp*" | sed -E 's|(.*)\/(.*)\/temp(.[a-z]{3})|\/\/|g'
./History/10/5/10552/10552.xxx
./History/10/5/10553/10553.xxx
./Stories/00/0/00000/00000.xxx
./Stories/00/0/00001/00001.xxx

Assim, transformamos cada temp* em um comando mv com nomes de saída obrigatórios. O comando é assim:

$ find . -name "temp*" | sed -E 's|(.*)\/(.*)\/temp(.[a-z]{3})|mv & \/\/|g'
mv ./History/10/5/10552/temp.xxx ./History/10/5/10552/10552.xxx
mv ./History/10/5/10553/temp.xxx ./History/10/5/10553/10553.xxx
mv ./Stories/00/0/00000/temp.xxx ./Stories/00/0/00000/00000.xxx
mv ./Stories/00/0/00001/temp.xxx ./Stories/00/0/00001/00001.xxx

Para executar todos os comandos da saída anterior, devemos adicionar | source /dev/stdin no final do comando.

Os resultados serão os seguintes:

$ find . -name "*.xxx"
./History/10/5/10552/10552.xxx
./History/10/5/10553/10553.xxx
./Stories/00/0/00000/00000.xxx
./Stories/00/0/00001/00001.xxx
    
por 18.12.2014 / 11:53