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".
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?
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.
Tags command-line bash mv linux shell