Script Bash que remove parte de um nome de arquivo em todos os arquivos em um diretório

0

Eu tenho vários arquivos em um diretório cujos nomes estão no formato *.foo.bar . Gostaria de escrever um script bash para renomear cada um desses arquivos, removendo a .foo part.

Por exemplo, suponha que a emissão de tree ~/dir/ retorne

/home/user/dir/
|- george.foo.bar
|- john.foo.bar
|- paul.foo.bar
|- ringo.foo.bar
|- subdir
   |- jimmy.foo.bar
   |- robert.foo

Em seguida, executar script ~/foo/ deve alterar o conteúdo de ~/foo para

/home/user/dir/
|- george.bar
|- john.bar
|- paul.bar
|- ringo.bar
|- subdir
   |- jimmy.bar
   |- robert.foo
    
por Brian Fitzpatrick 24.08.2015 / 04:21

2 respostas

1

Você pode usar o mecanismo de expansão de parâmetros

shopt -s globstar
for file in **/*foo.bar; do
    prefix="${file%.foo*}"
    suffix="${file##*.foo}"
    mv -v -- "$file" "$prefix$suffix"
done

O ${file%.foo*} remove o sufixo correspondente (deixando apenas o prefixo) e ${file#*.foo} remove o prefixo (deixando o sufixo). A estrela dupla glob ( ** ) é necessária para percorrer todos os subdiretórios e setopt -s globstar permite essa glob.

    
por 24.08.2015 / 04:38
0

Para renomear todos os arquivos com .foo.bar para .bar no diretório atual e em seus subdiretórios:

rename 's/\.foo\.bar/\.bar/'  * */*

Aqui, rename é o utilitário de renomeação do pacote perl. Em alguns sistemas, pode ser chamado prename .

(Existe, infelizmente, também um executável rename que alguns sistemas instalaram do pacote util-linux . É incompatível .)

    
por 24.08.2015 / 04:42