![Como renomear muitos arquivos no shell bash?](https://rvso.com/image/1416382/Como%20renomear%20muitos%20arquivos%20no%20shell%20bash%3F.png)
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 file
como igual ao nome do arquivo e executará o comando entre ; do
e; done
mv $file _______
mv
é a maneira tradicional de renomear arquivos no unix/linux. Ele irá renomear file
para_______
echo $file | sed 's/_039/_036_2'
echo $file | sed
simplesmente enviará " file
" para o stdin de sed
, onde sed
substituirá "_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
( X
pode 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 find
comando 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