Como renomear muitos arquivos no shell bash?

Como renomear muitos arquivos no shell bash?

Desculpe pela pergunta. Pesquisei bastante na internet, mas não consegui encontrar uma resposta que funcionasse (embora houvesse muitas sugestões).

Então, quero renomear MUITOS arquivos. Escrever todos os nomes de arquivos não é uma opção. Os arquivos são nomeados assim:

HAUPT_SIA_039.MR.NEUROPSYCHOLOGIE_LOGIN.0003.0001.2014.03.28.14.49.59.511530.47117493.IMA

o início é sempre o mesmo e também o .IMA O número longo não é o mesmo para todos os arquivos. Tenho que mudar o 039 para 036_2, para todos os arquivos. O resto deve permanecer igual.

Tentei todos os comandos a seguir (além de vários outros), mas não adiantou nada:

cd my_directory

rename 's/\w039_2\w/\w036_2\w/g' * 

rename ?039_2? ?036_2? ?0_39_2?.IMA

rename 's/?039_2?/?036_2?/' ?039_2?.IMA

rename 's/\w039_2\w/\w036_2\w/' ?039_2?.IMA

Perl está instalado no sistema Linux (mas não sei como chamá-lo... porque se eu abrir um terminal Perl ele não faz nada).

Pode me ajudar?

Responder1

for file in * ; do mv $file $(echo $file | sed 's/_039/_036_2') ; done

Explicação:

for file in * ; do _______ ; done

bash realizará a expansão do shell para *listar todos os arquivos no diretório de trabalho. Para cada um desses arquivos, esta estrutura de comando definirá a variável filecomo igual ao nome do arquivo e executará o comando entre ; doe; done

mv $file _______

mvé a maneira tradicional de renomear arquivos no unix/linux. Ele irá renomear filepara_______

echo $file | sed 's/_039/_036_2'

echo $file | sedsimplesmente enviará " file" para o stdin de sed, onde sedsubstituirá "_039" por "_036_2"

Ao todo: para cada arquivo no diretório atual, renomeie o arquivo, substituindo "_039" por "_036_2"

Responder2

Seu regexp está bagunçado, aqui está um que deve funcionar.

rename 's/HAUPT_SIA_039[.]\(.*\)/HAUPT_SIA_039_2.\1/g' HAUPT_SIA*.IMA

Você está usando a ferramenta correta, não há necessidade de localizar, a menos que tenha subdiretórios.


Nota sobre regexp em sed e renomear.

O formato é sXsearch_patternXreplace_patternXoptions( Xpode ser qualquer caractere). searchPattern é o que você deseja substituir, para o que já existe, não para o que você está substituindo.

-wé uma única palavra e só pode estar em search_pattern.

Responder3

encontrar . -nome "*039*" | renomear 's/039/036_2/g'

Responder4

Faça um loop em todos os arquivos com o prefixo "HAUPT_..." e, em seguida, renomeie usando a substring do shell ${f:15}retorna a string do 15º caractere do nome do arquivo, anexado ao HAUPT_...prefixo.

for f in "HAUPT_SIA_039*" ; do  mv $f "HAUPT_SIA_036_2${f:15}"; done

EDITAR - Parece que o diretório com todos os arquivos também contém subdiretórios com o mesmo prefixo HAUPT.... Nesse caso use o findcomando para primeiro filtrar apenas os arquivos e não os diretórios.

find . -type f -name "HAUPT_SIA_039*" | while read f; do mv $f "HAUPT_SIA_036_2${f:15}"; done

informação relacionada