Comando Shell para remover a extensão de arquivos

2

Eu tenho um diretório com arquivos gerados automaticamente que terminam com a extensão .sample. Eu gostaria de ter uma maneira de remover a extensão .sample deles todos em um comando terminal.

Eu tentei isso:

mv ./{$1}*.sample ./$1

Mas isso não funciona porque estou definitivamente colocando {$ 1} no lugar ou no caminho errado. Alguém pode apontar para a direção certa?

Obrigado antecipadamente.

    
por rogeriopvl 12.09.2009 / 18:40

4 respostas

19

$ touch {a,b,c,"white space"}.sample

$ ls *.sample
a.sample        c.sample
b.sample        white space.sample

$ for SAMPLE in *.sample; do mv -v "$SAMPLE" "${SAMPLE%.sample}"; done
a.sample -> a
b.sample -> b
c.sample -> c
white space.sample -> white space

Editar : veja também ${parameter#word} , que exclui word da frente de parameter :

$ FILENAME=140909_stats_report.txt
$ echo "${FILENAME#140909_}"
stats_report.txt

Eu me lembro de qual delas eu preciso das posições das chaves # e % no meu teclado (Reino Unido): # é deixado de % então corresponde à esquerda. Antes eu percebi que tinha que checar a página de manual todo tempo: ~)

Essas expansões também oferecem suporte a curingas de shell:

$ echo "${FILENAME%.*}"
140909_stats_report

Os formulários # e % correspondem à menor expansão de word . Você pode usar ## ou %% para a correspondência mais longa. Por exemplo:

$ FILENAME=140909_stats_report.txt
$ echo "${FILENAME#*_}"  # match as little as possible
stats_report.txt
$ echo "${FILENAME##*_}" # match as much as possible
report.txt

Vale a pena lidar com essas expansões. Há vários outros, incluindo suporte de regex (um pouco irritadiço), substrings e maneiras de definir padrões ou obter comprimentos variáveis. Man bash , claro.

    
por 12.09.2009 / 19:33
6
for n in *.sample ; do mv "$n" "$(basename "$n" .sample)" ; done
    
por 12.09.2009 / 19:12
5

O comando rename aceita expressões Perl:

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

Exemplo:

$ ls *sample*
file0.sample  file2.sample  foo.sample.sample
file1.sample  file3.sample  with space.sample
$ rename 's/\.sample$//' *.sample
$ ls *sample*
foo.sample

No meu sistema Ubuntu, rename é um link simbólico para o script prename do pacote perl .

    
por 12.09.2009 / 21:28
1
rename '.sample' '' *.sample

No Fedora, o comando rename está incluído no pacote util-linux-ng .

    
por 12.09.2009 / 21:09