Remove uma extensão específica de todos os arquivos em um diretório [duplicado]

11

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...)
    
por DiogoSaraiva 21.01.2015 / 14:19

7 respostas

14

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
    
por 21.01.2015 / 14:28
4

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 "" *
    
por 21.01.2015 / 16:31
3

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.

    
por 21.01.2015 / 14:30
2

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'
    
por 21.01.2015 / 23:42
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.

    
por 21.01.2015 / 14:32
-1

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
    
por 21.01.2015 / 14:32
-2

"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
    
por 21.01.2015 / 18:54