mv arquivos com vários '.' no nome do arquivo

1

Eu tenho alguns arquivos que recebo com nomes como (para muitos fazerem isso manualmente todos os dias):

AA.B.txt
WW.C.txt

e quero renomeá-los para AA_B.txt e WW_C.txt para que o código SQL existente ainda funcione como esperado. No momento, esses arquivos são ignorados devido ao formato filename.letter.txt.

ls funciona e mostra esses arquivos:

$ ls -a *.*.txt
AA.B.txt*
ABR.A.txt*
ABR.B.txt*
ABR.C.txt*
ACT.A.txt*

No entanto, um comando mv semelhante falha:

$ mv *.*.txt *_*.txt
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Como faço para combinar o padrão que tenho com o que eu quero?

    
por Jason 21.09.2018 / 15:01

2 respostas

2

mv não é a ferramenta certa.

Você deve usar o comando rename :

rename 's/\./_/' *.*.txt

A string 's/\./_/' significa "substitua a primeira ocorrência de . por _ na lista de arquivos".

    
por 21.09.2018 / 15:09
2

O comando mv só pode ter um destino, seja renomeando um arquivo (por exemplo, mv AA.B.txt AA_B.txt) ou movendo um conjunto de arquivos e diretórios para um diretório (por exemplo, mv . .txt newdir ). Se você quiser renomear um arquivo, precisará fazer um de cada vez. Então, algum tipo de loop.

Tente algo como o seguinte:

for f in *.*.txt; do
    mv ${f} $(echo ${f} | sed -e 's#\.#_#')
done

O comando sed substitui apenas o primeiro ponto encontrado com um sublinhado. Quaisquer pontos restantes são intocados.

Espero que isso ajude.

    
por 21.09.2018 / 15:09