Como renomear muitos arquivos no bash shell?

1

Desculpe pela pergunta. Eu procurei muito na internet, mas não encontrei 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 começo é sempre o mesmo e também o .IMA O número longo não é o mesmo para todos os arquivos. Eu tenho que mudar o 039 em 036_2, para todos os arquivos. O resto deve permanecer o mesmo.

Eu tentei todos os comandos a seguir (além de vários outros), mas não fez 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

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

Você pode me ajudar?

    
por nooooob 22.07.2014 / 10:25

4 respostas

1

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

Explicação:

for file in * ; do _______ ; done
O

bash executará a expansão do shell em * para listar todos os arquivos no diretório de trabalho. Para cada um desses arquivos, essa 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 renomeia 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"

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

    
por 22.07.2014 / 10:58
1

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

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

Você está usando a ferramenta correta, sem necessidade de encontrar, a menos que tenha subdiretórios.

Observe o regexp em sed e renomeie.

O formato é sXsearch_patternXreplace_patternXoptions ( X pode ser qualquer caractere). searchPattern é o que você está procurando para 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.

    
por 22.07.2014 / 11:20
0

encontre. -name "* 039 *" | renomear 's / 039 / 036_2 / g'

    
por 22.07.2014 / 10:55
0

Faz o loop de todos os arquivos com o prefixo "HAUPT _..." e renomeia usando a substring do shell ${f:15} retorna a string do 15º caractere do nome do arquivo, anexado ao prefixo HAUPT_... .

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 comando find 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
    
por 22.07.2014 / 11:02