Como anexar uma string a um nome de arquivo no Bash Shell?

5

Então, devo encontrar todos os arquivos no diretório fornecido com o surffix de .C ou cc, e mude seu nome para .C.blah ou .cc.blah

Existe um comando para fazer isso?

Ou devo implementar isso com o comando find?

    
por Anson 18.01.2012 / 05:39

4 respostas

6

Existem algumas abordagens, dependendo do que está disponível no seu * nix.

Existem dois comandos rename diferentes, um fornecido por perl e um como parte de utilitários padrão.

Versão Perl:

rename 's/(\.cc$|\.C$)/$1.blah/' *.cc *.C

versão utils - você pode fazer isso com uma linha:

rename .C .C.blah *.C
rename .cc .cc.blah *.cc

para loop:

for i in *.C *.cc ; do mv $i $i.blah ; done
    
por 18.01.2012 / 07:12
1

Sei que você já encontrou sua própria solução aceitável, mas quero postar o que normalmente usaria no trabalho. Esta sintaxe funciona para o GNU findutils, que faz parte de qualquer distribuição Linux moderna.

## xargs is much faster than -exec, xargs can run parallel on # cores with -P #
find ./ -type f -name '*.C' -o -name '*.cc' | xargs -I '{}' mv '{}' '{}'.BAK

##  If I'm specifying more than two extensions, I would generally use a regex
find ./ -type f -regex ".*\.\(C\|cpp\)$" | xargs -I '{}' mv '{}' '{}'.BAK

Especialmente com os servidores SMP quad-core agora comuns, normalmente você pode executar metade do tempo com -p 4 . Mesmo com apenas um núcleo, xargs evita que o forking externo find ...-exec seja iniciado. Com uma área de trabalho e tempo ilimitado, isso não é realmente um problema. Por outro lado, usando recursos do servidor e trabalhando com muitos milhares de arquivos, evitar a sobrecarga desnecessária é uma prioridade.

    
por 18.01.2012 / 08:40
1

use um loop simples:

for file in *.txt; do echo $file $file.blah; done

Este comando ecoa o nome do arquivo antigo e o novo arquivo no terminal. Se você está obtendo resultados esperados, vá para o comando real:

for file in *.txt; do mv $file $file.blah; done

De qualquer forma, isso não renomeará arquivos * .txt em subdiretórios. Use achado para isso.

    
por 18.01.2012 / 14:06
0

Existem dois comandos rename diferentes.

No Ubuntu / Debian / ... distros:

rename -v 's/$/.blah/' *.C *.cc

Em RedHat / CentOS / ... distros:

rename -v $ .blah *.C *.cc
    
por 19.01.2012 / 00:43