Renomeie um conjunto de arquivos com o padrão name.1.gz.html para name.html

2

Eu tentei usar o comando:

mv *.1.gz.html *.html

Mas recebi a resposta:

<filename> is not a directory.

Como posso fazer isso funcionar? Eu tentei o comando rename também, mas também não consegui fazer isso funcionar. Muito regex para mim.

Acho que usar xargs funcionaria, se eu entendesse isso melhor.

    
por linstar 03.07.2015 / 04:41

2 respostas

4

mv renomeia um único arquivo ou move muitos arquivos para um único diretório.

Se você quiser renomear muitos arquivos, provavelmente desejará usar rename .

Dependendo da sua versão de rename você faz:

 rename .1.gz.html .html *.1.gz.html

ou

 rename 's/\.1\.gz\.html/\.html/' *.1.gz.html

A primeira versão é um pouco mais fácil de escrever, a segunda é mais poderosa e às vezes está disponível como perl-rename . Dê uma olhada em man rename para encontrar a sintaxe correta.

    
por 03.07.2015 / 07:33
1

Um caractere curinga como esse é expandido em tudo que corresponde a ele antes que o comando mv seja executado. Para piorar, o *.html também corresponderá aos arquivos *.1.gz.html .

Isso significa que (por exemplo, dois arquivos chamados abc.1.gz.html e def.1.gz.html ) seu comando acima está essencialmente em execução:

mv abc.1.gz.html def.1.gz.html abc.1.gz.html def.1.gz.html

Isso tentará mover abc.1.gz.html e def.1.gz.html para um diretório chamado def.1.gz.html . Felizmente isso falha, pois esse arquivo não é um diretório.

Você precisará criar um script para ver cada arquivo, um de cada vez por exemplo:

for file in *.1.gz.html; do
  mv "$file" "'echo $file | sed 's/\.gz\.html$/.html/''"
done
    
por 03.07.2015 / 05:06

Tags