Como renomear vários arquivos removendo a extensão?

13

Eu tenho vários arquivos tiff chamados:

sw.001.tif
sw.002.tif
...

e quero remover o .tifno final de cada um dos arquivos. Como posso usar o renamecomando para fazer isso?

Paulo
fonte
2
Lembre-se de que nenhum sistema de arquivos linux ou unix usa "extensões" no estilo Windows ou VMS - é apenas por convenção que um sufixo do nome do arquivo é ".tif" ou ".c" ou ".o" ou ".so " como queiras.
22612 Bruce Ediger
Isso é bom ... Eu estou a importação de arquivos de Windows para Linux :)
Paul
1
Tecnicamente, o Windows também não usa extensões de arquivo, mas o gerenciador de arquivos do Windows 95 continuou usando os últimos caracteres do nome do arquivo para determinar o tipo de arquivo após interromper o esquema de nomeação do MS-DOS e a convenção permaneceu desde então.
RAKK 20/02

Respostas:

23

perl's rename(como normalmente encontrado no Debian, onde também é chamado prename), ou este derivado ( renamepacote no Debian):

rename 's/\.tif$//' *.tif

util-linux rename(como normalmente encontrado no Red Hat, rename.ulno Debian):

rename -- .tif '' *.tif

(observe que esse seria renomeado blah.tiffany.tifpara blahfany.tif)

Ignacio Vazquez-Abrams
fonte
2
Eu acredito que o renomeado "Debian" é de Larry Wall (vem com Perl?) E o "Red Hat" é do util-linux (rename.ul no Debian IIRC).
XTL
@XTL: Verdadeiro. Eu os chamo assim porque são os programas de "renomeação" encontrados nos derivados Debian ou Red Hat.
Ignacio Vazquez-Abrams
Muito obrigado! Eu nunca percebi que havia versões diferentes de 'renomear'. Eu assumo que existem outras diferenças sutis entre os comandos no debian & redhat. Vou ter que procurar algumas de suas diferenças.
Paul
6

Para uma não renomeação, você pode fazer:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i para advertir contra a substituição de um arquivo)

XTL
fonte
15
Versão mais for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
segura e
+1 no último comentário aqui. É mais seguro em nomes de arquivos com espaços vazios.
Petobens 14/05/19
1
@ jw013 seu comentário deve ser uma resposta de nível superior.
Roland
1
rename -- .oldext .newext *.oldext

Isso substitui a extensão antiga pela nova. Para simplesmente remover a extensão, você pode transmitir explicitamente uma string vazia como argumento.

rename -- .gz.tmp  '' *.gz.tmp

Com o comando acima, todos os arquivos com .gz.tmpextensão na pasta atual serão renomeados para filename.gz.

Consulte o artigo: Linux: remova extensões de arquivos para vários arquivos para obter detalhes.

Manpreet Singh
fonte
1
Isso pressupõe que a implementação util-linux renameseja incompatível com (e muito mais limitada que) o renamecomando tradicional do perl.
Stéphane Chazelas
Observe também que ele substitui a primeira ocorrência de .oldextdentro do nome do arquivo, não necessariamente a extensão ( foo.oldextasy.oldextseria renomeada para footasy.oldext).
Stéphane Chazelas
1

Se você usar o IBM AIX, não terá um renamecomando; portanto, para remover extensões de arquivo em lote, será necessário usar comandos simples do System V UNIX da baunilha:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;
RAKK
fonte
-2

podemos fazer isso recursivo

for i in *.gz; do mv -i $i `basename $i .gz`; done
user3361573
fonte