Gostaria de alterar uma extensão de arquivo de *.txt
para *.text
. Tentei usar o basename
comando, mas estou tendo problemas para alterar mais de um arquivo.
Aqui está o meu código:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Estou recebendo este erro:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
fonte
fonte
Respostas:
Diretamente da Wiki de Greg :
Veja também a entrada sobre por que você não deve analisar
ls
.Edit: se você tiver que usar
basename
sua sintaxe seria:fonte
*.txt
sintaxe) , o traço duplo simples--
e o uso do símbolo% na${}
construção . Até agora, eu nunca tinha encontrado os dois últimos e não sabia o que realmente estava acontecendo com o primeiro.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Aqui está como eu mudo todas as extensões de arquivo no diretório atual do Debian.
(Este é o Perl
rename
comando, e não autil-linux
um. Veja Por que é o utilitário de renomeação no Debian / Ubuntu diferente do que em outras distribuições, como o CentOS? )fonte
brew install rename
e isso funcionou.rename "s/oldExtension/newExtension/" **.txt
para mudar o nome all * .txt recursivamentefootxt.txt
. Em vez disso, use isto: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Um comando simples, o
rename
fromutil-linux
, fará isso por você, substituindo todas as ocorrências de "txt" por "text" em todos os arquivos correspondentes a "* .txt":fonte
rename
altera a primeira ocorrência, é melhor fazer issorename .txt .text
, mas isso nem sempre funciona (por exemplo, renomeiafoo.txtx.bar.txt
parafoo.textx.bar.txt
).rename
comando é realmenteperl-rename
e usa expressões regulares perl. Para isso, o comando equivalente seria:rename 's/.txt/.text/' *.txt
. As pessoas devem verificar oman rename
sistema para descobrir qual delas possuem.Acima funciona bem, mas limitado ao diretório atual. Experimente o comando abaixo, que é flexível com subdiretórios. Ele renomeará todos os
.txt
arquivos na estrutura de diretórios com uma nova extensão.fonte
rename
pode lidar com vários arquivos como argumento, você pode vastamente acelerar as coisas, usando+
, em vez de\;
se há muitos desses arquivosfootxt.txt
. Em vez disso, use isto: unix.stackexchange.com/questions/19654/…fonte
As respostas aqui referenciadas
s/oldExtension/newExtension/
estão erradas. Se você usars/txt/text/
, você converteráfootxt.txt
parafootext.txt
, que não é o que você deseja. Mesmo se você usars/.txt/.text/
, isso seria convertidofootxt.txt
parafo.text.txt
.Você precisa usar
\.
para corresponder ao período (.
corresponderá a qualquer caractere). E o final$
para coincidir com o final da linha. Somente isso corresponderá corretamente à extensão.fonte
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
paraext2
. Também gera nomes dos arquivos que estão sendo renomeados.Exemplo de uso (assumindo que o nome do script seja
change-ext
):fonte
for...
) por duas linhas:shopt -s globstar
efor f in **/*.$1
. Requer Bash 4+.Razão # 53 para mudar para zsh:
zmv '(*).txt' '$1.text'
fonte
digamos que seus arquivos estão espalhados em vários diretórios. Supondo que dirx seja seu diretório pai, isso pode ser feito usando find:
fonte
Isto é o que funciona para mim:
fonte
Quando você
e a extensão de destino é .text, você faria dessa maneira -
fonte
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Caso você queira saber o que deu errado na sua versão: Você usou no
$files
lugar do$x
comando basename. Portanto, isso deve funcionar (não testado, no entanto):fonte