Alterando a extensão para vários arquivos

132

Gostaria de alterar uma extensão de arquivo de *.txt para *.text . Eu tentei usar o comando basename , mas estou tendo problemas para alterar mais de um arquivo.

Estou recebendo este erro:

basename: too many arguments Try basename --help' for more information

Aqui está o meu código:

files='ls -1 *.txt'

for x in $files
do
    mv $x "'basename $files .txt'.text"
done
    
por afbr1201 29.08.2011 / 08:33

11 respostas

137

Direto do Greg's Wiki :

# Rename all *.txt to *.text
for f in *.txt; do 
    mv -- "$f" "${f%.txt}.text"
done

Veja também a entrada sobre por que você não deve analisar ls .

Editar: se você tiver que usar basename , sua sintaxe seria:

for f in *.txt; do
    mv -- "$f" "$(basename -- "$f" .txt).text"
done
    
por 29.08.2011 / 08:52
114

Veja como eu mudo todas as extensões de arquivos no diretório atual no Debian.

rename "s/oldExtension/newExtension/" *.txt

(Este é o comando Perl rename , não o util-linux um. Consulte Por que a utilidade renomear no Debian / Ubuntu diferente do que o de outras distribuições, como o CentOS?

    
por 05.10.2014 / 22:45
24

Um comando simples, o rename de util-linux , fará que para você, substitua todas as ocorrências de "txt" para "texto" em todos os arquivos correspondentes "* .txt":

rename txt text *.txt
    
por 29.08.2011 / 09:04
20
rename "s/oldExtension/newExtension/" *.txt

Acima funciona bem, mas limitado ao diretório atual. Experimente o comando abaixo, que é flexível com subdiretórios. Ele renomeará todos os arquivos .txt sob a estrutura de diretório com uma nova extensão.

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
    
por 17.02.2015 / 09:34
7
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
    
por 29.08.2011 / 08:49
6

As respostas aqui referenciando s/oldExtension/newExtension/ estão erradas. Se você usar s/txt/text/ , converterá footxt.txt para footext.txt , o que não é o que você deseja. Mesmo se você usar s/.txt/.text/ , isso converterá footxt.txt em fo.text.txt .

Você precisa usar \. para corresponder ao período ( . corresponderá a qualquer caractere). E o $ à direita para corresponder ao final da linha. Somente isso corresponderá corretamente à extensão.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
    
por 02.08.2017 / 01:53
4

Com base na resposta do @Prince John Wesley, aqui está um script simples para alterar todas as extensões de arquivos no diretório atual de ext1 para ext2 . Também gera nomes dos arquivos que estão sendo renomeados.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

Exemplo de uso (supondo que o nome do script seja change-ext ):

change-ext ext1 ext2
    
por 01.02.2012 / 08:54
1

digamos que seus arquivos estejam espalhados em vários diretórios, Assumindo que dirx é seu diretório pai, isso pode fazer o trabalho usando find:

for f in 'find /dirx -iname '*.txt' -type f -print';do  mv "$f" ${f%.txt}.text; done
    
por 11.08.2014 / 18:56
1

Isso é o que funciona para mim:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
    
por 27.02.2017 / 15:26
1

Razão # 53 para mudar para o zsh:

zmv '(*).txt' '$1.text'

    
por 18.09.2018 / 19:13
0

Caso você queira saber o que deu errado na sua versão: Você usou $files em vez de $x no comando basename. Então, isso deve funcionar (não testado, no entanto):

for x in *.txt
do
  mv "$x" "'basename '$x' .txt'.text"
done
    
por 18.02.2015 / 08:39

Tags