Como faço para criar uma cópia de um arquivo em vários diretórios?

1

Eu tenho uma estrutura de pastas

conf/
    widget1/
        env1.cfg
        env2.cfg
    widget2/
        env1.cfg
        env2.cfg
    widget3/
        env1.cfg
        env2.cfg
    widget4/
        env1.cfg
        env2.cfg
    ...

O que eu quero fazer é encontrar todos os arquivos chamados env2.cfg e criar uma cópia deles em seu diretório chamado env3.cfg .

Eu tentei:

find -name env2.cfg -exec cp '{}' "env3.cfg" ";"

mas isso criou env3.cfg no diretório conf/ .

Alguma opinião?

Para esclarecimentos, estou fazendo isso no Mac OSX, mas o ideal é que o mesmo comando funcione no CentOS, se possível.

    
por Jason Nichols 17.04.2015 / 17:00

3 respostas

2

Tente

find . -name env2.cfg -execdir cp {} env3.cfg \;

Substituindo exec para execdir . Isso significará que sua 'ação' ( cp ) ocorrerá dentro da pasta onde o arquivo ( env2.cfg ) foi encontrado.

    
por 17.04.2015 / 17:14
2

Seu exemplo copia todos os arquivos env2.cfg para o diretório de trabalho atual, que é ".". Você precisa dar o arquivo encontrou um novo nome, incluindo o seu diretório. Este trabalhou para mim:

for file in $(find . -name env2.cfg); do backup=$(echo $file | sed 's/env2.cfg/env3.cfg/'); cp $file $backup; done

edite: Ou a maneira ainda mais elegante, para que você não precise se preocupar com vários comandos:

for file in $(find . -name env2.cfg); do cp $file ${file/env2/env3}; done
    
por 17.04.2015 / 17:10
1

Como é uma estrutura estática, você pode endereçar diretamente os nomes dos arquivos e deixar que eles sejam copiados:

for f in conf/widget*/env2.cfg
do
    cp "${f}" "${f/env2/env3}"
done
    
por 17.04.2015 / 17:24

Tags