Use o mecanismo de substituição de parâmetros do bash para remover o padrão de sufixo correspondente:
for file in *.old; do
mv -- "$file" "${file%%.old}"
done
Eu tenho alguns arquivos com a extensão ".old".
Como posso remover a extensão ".old" sem remover o arquivo?
Eu posso fazer isso manualmente, mas com mais trabalho:
mv file1.key.old file1.key
mv file2.pub.old file2.pub
mv file3.jpg.old file3.jpg
mv file4.jpg.old file4.jpg
(etc...)
O comando funcionará com outras extensões também?
exemplo:
mv file1.MOV.mov file1.MOV
mv file2.MOV.mov file2.MOV
mv file3.MOV.mov file3.MOV
(etc...)
ou melhor:
mv file1.MOV.mov file1.mov
mv file2.MOV.mov file2.mov
mv file3.MOV.mov file3.mov
(etc...)
Use o mecanismo de substituição de parâmetros do bash para remover o padrão de sufixo correspondente:
for file in *.old; do
mv -- "$file" "${file%%.old}"
done
Você não disse qual sistema operacional está usando, mas muitas distribuições do Linux têm um comando rename
que você pode usar para isso. Na verdade, existem dois comandos rename
bem diferentes - o Debian e sistemas similares fornecem um enquanto o RedHat e o similar fornecem outro - mas qualquer um funcionará aqui.
Perl baseou rename
no Debian, Ubuntu etc, veja: manual do prename .
Util-Linux rename
no Redhat etc, consulte: renomear o manual .
No Debian e similar você pode fazer:
rename 's/\.old$//' *
ou:
rename s/.MOV.mov/.mov/ *.*
No Redhat e semelhante, você pode fazer:
rename .old "" *
Existem várias ferramentas de renomeação, como o link
Mas acho que a maneira mais rápida de renomear é um script simples como:
for i in *.old
do
mv -- "$i" "${i%.old}"
done
Observe que não há verificação de erros e, se o arquivo de destino existir, ele pode ser substituído.
Com zsh, carregue primeiro a função zmv com
autoload zmv
(você pode fazer isso a partir do seu .zshrc
), em seguida, execute
zmv -w '*.old' '$1'
ou
zmv '(*).old' '$1'
Se você quiser restringir as respostas à programação shell (Bash) (em vez de usar uma ferramenta de renomeação), tente isto:
for oldname in *.old ; do
newname="${oldname%%.old}"
if [ -e "$newname" ] ; then
echo "Cannot rename $oldname because $newname exists." >&2
else
mv -- "$oldname" "$newname"
fi
done
Eu uso aspas em torno de $oldname
e $newname
porque nomes de arquivos podem conter espaços em branco.
Supondo que "arquivo" não contém um "." :
ls -1 | while read line; do mv "$line" "'echo $line | cut -d'.' -f1,2'"; done
Este exemplo divide o nome do arquivo por período e com -f
você pode controlar os campos a serem mantidos.
Para o seu terceiro exemplo, você usaria:
ls -1 | while read line; do mv "$line" "'echo $line | cut -d'.' -f1,3'"; done
"Refinamento" da solução de Christian ( link ) usando rev:
ls -1 | while read line; do mv "$line" "'echo $line | rev | cut -d'.' -f2- | rev'"; done