Renomeia recursivamente arquivos usando find e sed

1

Eu quero passar por vários diretórios e renomear todos os arquivos que terminam em _test.rb para finalizar em _spec.rb. É algo que eu nunca imaginei como fazer com o bash, então desta vez eu pensei em me esforçar para conseguir. Até agora eu fiquei aquém, meu melhor esforço é:

find spec -name "*_test.rb" -exec echo mv {} 'echo {} | sed s/test/spec/' \;

NB: há um eco extra depois do exec para que o comando seja impresso ao invés de ser executado enquanto eu estou testando.

Quando eu executo, a saída para cada nome de arquivo correspondente é:

mv original original

i.e. a substituição por sed foi perdida. Qual é o truque?

    
por opsb 25.01.2011 / 14:31

3 respostas

3

Se você não tem rename (é realmente um script Perl curto) ou sua renomeação é a versão mais simplista do util-linux ou você simplesmente quer saber como fazer seu comando funcionar: você só precisa enviá-lo para o shell para execução:

find spec -name "*_test.rb" -exec sh -c 'echo mv "$1" "$(echo "$1" | sed s/test.rb\$/spec.rb/)"' _ {} \;
    
por 25.01.2011 / 17:59
4

Muito complicado. Se você tiver o comando rename disponível, tente o seguinte:

find . -name "*_test.rb" -print0 | xargs -0 rename "s/_test/_spec/" 

Isso localiza os arquivos relevantes, envia-os para xargs que, por sua vez, usa a ferramenta renomear (que renomeia os arquivos de acordo com o regex perl fornecido).

    
por 25.01.2011 / 15:09
0

A partir da página man do rename do util-linux:

   rename '_with_long_name' '' file_with_long_name.*

will remove the substring in the filenames.

Portanto, este comando funciona se você não tiver a versão Perl de renomear:

find . -name "*_test.rb" -print0 | xargs -0 rename "_test..rb" "_spec/rb" 
    
por 11.05.2018 / 19:03