Como renomear vários arquivos substituindo word no nome do arquivo?

36

Substitua ACDC por AC-DC

Por exemplo, temos esses arquivos

ACDC - Rock N 'Roll não é poluição sonora.xxx

ACDC - Rocker.xxx

ACDC - Atirar em emoção.xxx

Eu quero que eles se tornem:

AC-DC - O Rock N 'Roll não é poluição sonora.xxx

AC-DC - Rocker.xxx

AC-DC - Atire para a emoção.xxx

Eu sei que sed ou awk é usado para esta operação. Não consigo pesquisar no google, por isso estou pedindo sua ajuda =) Você poderia fornecer um comando shell de trabalho completo para esta tarefa?

Feedback: solução para usuários OSX

holms
fonte
1
Eu sinto que há uma pergunta maior aqui - você está tentando consertar nomes de arquivos mp3 em geral? Existem vários scripts que as pessoas escreveram ao longo dos anos para fazer isso. Eu acho que um que eu usei foi chamado mp3fixer.
precisa saber é o seguinte
Não, não se trata de mp3. Eu apenas tenho que gerenciar alguns arquivos enormes com nomes semelhantes, e algo deve ser substituído ou corrigido. Situação comum. Preciso dessa solução bacana para renomear todos eles
Holms

Respostas:

45
rename 's/ACDC/AC-DC/' *.xxx

a partir de man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

Por exemplo, para renomear todos os arquivos correspondentes a "* .bak" para remover a extensão, você pode dizer

rename 's/\.bak$//' *.bak

Para converter nomes maiúsculos em minúsculos, você usaria

rename 'y/A-Z/a-z/' *
Joel K
fonte
5
Observe que muitas máquinas linux vêm com renomeação do util-linux, que implementa substituição simples, não regexes. Portanto, se a renomeação falhar silenciosamente sem fazer nada, você provavelmente está usando o errado rename.
precisa saber é o seguinte
Eu estava pesquisando isso há muito tempo! thnx!
holms
@PhilHollenback Como encontrar / instalar o caminho certo, então? :)
henry
Não funciona quando tenho sublinhados nos meus nomes de arquivos em vez de espaços - como posso resolver isso?
unfa
13

Esta resposta contém as partes boas de todas as outras respostas, deixando de fora heresia como ls | while read.

Diretório atual:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Incluindo subdiretórios:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

Caracteres de nova linha são realmente improvável que seja em nomes de arquivos, de modo que este pode ser mais simples enquanto ainda estiver trabalhando com nomes contendo espaços:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
gravidade
fonte
9

Para usar a versão util-linux renamedaquele Phil referido (no Ubuntu, é chamado rename.ul):

rename ACDC AC-DC ACDC*

ou

rename.ul ACDC AC-DC ACDC*
Pausado até novo aviso.
fonte
1
sua variante é a melhor =) tantos artigos estúpidos no google sobre encontrar e enviar e despertar ... para esta operação simples para a qual o renameutils já existe!
holms
4

Usando o shell bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

Nota: using findprocessará o diretório atual e os diretórios em.

Anel Ø
fonte
1

Depende do seu shell. No zsh, eu faria o seguinte:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

Provavelmente não é a melhor solução, mas funciona.

polemon
fonte
1

Usando o bash:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

Se você possui o renameprograma instalado:

rename 's/ACDC/AC-DC/' *.xxx
ThatGraemeGuy
fonte