Como usar cygwin (ou comando linux) para renomear os arquivos e diretórios de forma recursiva com expressão regular

2

Estou usando o Windows e tentando usar o Cygwin para executar essa tarefa. Eu gostaria de renomear os arquivos e diretórios recursivamente da seguinte forma:
De:
1010110010 \
1010110010 \ 1010110010.jpg
1010110010 \ 1010110010.txt
1010110020 \
1010110020 \ 1010110020.jpg
1010110020 \ 1010110020.txt
...

para:
1-01-01-1-001-0 \
1-01-01-1-001-0 \ 1-01-01-1-001-0.jpg
1-01-01-1-001-0 \ 1-01-01-1-001-0.txt
1-01-01-1-002-0 \
1-01-01-1-002-0 \ 1-01-01-1-002-0.jpg
1-01-01-1-002-0 \ 1-01-01-1-002-0.txt
...

Eu estava pensando em usar para loop, mas para loop não poderia percorrer os diretórios de forma recursiva. Eu só posso usar para e sed para renomear uma lista de arquivos em um diretório:

for i in *; do j='echo $i | sed 's/\(.\)\(..\)\(..\)\(.\)\(...\)\(.\)/-----/g''; mv $i $j; done

Mas eu gostaria de renomear vários diretórios e os arquivos dentro. Então, eu tentei sobre "find", mas eu não sei como usar variáveis e expressões regulares com o comando "find". Além disso, como estou usando o Cygwin, só posso usar o comando "mv" em vez do comando "rename". Obrigado por qualquer sugestão.

    
por Allen 04.09.2010 / 15:36

3 respostas

0

O Unix tem várias maneiras poderosas de renomear arquivos. Aqui está um que usa zsh (certifique-se de tê-lo instalado). Isso primeiro renomeia os diretórios e renomeia os arquivos nos diretórios.

autoload zmv
zmv -o -i '(?)(??)(??)(?)(???)(?)' '$1-$2-$3-$4-$5-$6'
zmv -o -i '(*)/(?)(??)(??)(?)(???)(?).(*)' '$1/$2-$3-$4-$5-$6-$7.$8'

Não está claro, na sua pergunta, se os diretórios podem aninhar-se. Se o fizerem, aqui está um único comando que cuida dos diretórios e arquivos, aproveitando o fato de que uma única substituição de padrão funciona para ambos:

zmv -o -i '(**/)(?)(??)(??)(?)(???)(*)' '$1$2-$3-$4-$5-$6-$7$8'

Se você passar a opção -n para zmv , ela mostrará o que o comando teria feito sem realmente mover os arquivos. Eu uso -o -i no meu exemplo para que ele solicite confirmação se ele sobrescreveria um arquivo e executaria silenciosamente de outra forma.

zmv está documentado na página zshcontrib man.

    
por 04.09.2010 / 16:37
0

Arquivo :: Renomear ou do Debian prename , ambos em Perl.

    
por 04.09.2010 / 16:55
0

Isso encontrará vários arquivos recursivamente e fará um mv para renomeá-los usando sed para processar os nomes. Você pode alterar as especificações do arquivo e adicionar seu comando sed .

find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;
    
por 04.09.2010 / 16:51

Tags