Comando Unix para renomear múltiplos arquivos

2

Eu tenho alguns diretórios com diferentes arquivos plugin-cfg.xml dos quais quero fazer um backup e manter no mesmo diretório.

Por exemplo,

Plug6_a1/plugin-cfg.xml
Plug6_a2/plugin-cfg.xml
Plug6_a3/plugin-cfg.xml

Como posso fazer uma cópia de plugin-cfg.xml renomear para plugin-cfgbk.xml para cada diretório?

    
por scott marriott 17.05.2013 / 22:34

3 respostas

1

find Plu*_a* -type f -name plugin-cfg.xml -exec \
  sh -c 'cp "$1" "$(dirname "$1")"/plugin-cfgbk2.xml ' sh {} \;  

Para cada arquivo chamado plugin-cfg.xml localizado em um diretório cujo nome começa com Plu e contém _a , faça uma cópia de plugin-cfg.xml to plugin-cfgbk2.xml no mesmo diretório.

    
por 17.05.2013 / 22:50
1
dest=/path/to/backup/destination;
find plu6_a1 plu61_a2 -type f -iname '*.xml' -print0 | while IFS= read -rd '' f; do
    cp -- "$f" "${dest%/}/${f%.xml}-bk.xml"
done

Encontre todos os arquivos XML em plu6_a1 plu61_a2, faça uma cópia, adicione o sufixo -bk.xml à cópia e mova-o para "$ dest".

EDIT: Este código está escrito em Bash e também requer GNU ou BSD find (1).

    
por 17.05.2013 / 23:56
0

Aqui está um one-liner que requer apenas /bin/sh (isso só funciona para um único diretório, no entanto):

for f in ./*.xml; do cp "$f" "${f%cfg.xml}cfgbk.xml"; done

Assumindo que você tenha o bash 4+ (se você não sabe, provavelmente o faz; verifique com bash --version ), você pode usar o globstar para recursividade:

shopt -s globstar
for f in ./**/*.xml; do cp "$f" "${f%cfg.xml}cfgbk.xml"; done

Você pode querer considerar um esquema de nomeação mais claro para seus backups, no entanto - eu preferiria algo como acrescentar '.backup' aos nomes dos arquivos.

shopt -s globstar
for f in ./**/*.xml; do cp "$f" "$f".backup; done
    
por 27.06.2013 / 21:57

Tags