Copie o arquivo para todos os subdiretórios que contenham um arquivo com determinado nome

2

Eu estou tentando copiar um script features[30,55].R da minha área de trabalho para todos os subdiretórios que contêm um arquivo cujo nome é DONE .

Eu tentei o seguinte comando:

find . -name "DONE"  -exec sh  'cp /Users/percyli/Desktop/features[30,55].R {}' \;

no entanto, apresenta o seguinte erro:

sh: cp /Users/percyli/Desktop/features[30,55].R ./DONE: No such file or directory
sh: cp /Users/percyli/Desktop/features[30,55].R ./F3/F3-1/DONE: No such file or directory

onde ./F3/F3-1 é uma das pastas que contém o arquivo "DONE".

Eu também tentei:

find . -name "DONE"  -exec cp /Users/percyli/Desktop/features[30,55].R {} \;

Ele não solta um erro, mas nada acontece depois que eu executo este comando.

Qual pode ser o problema aqui e como posso corrigir isso?

    
por Percy 13.03.2016 / 22:20

1 resposta

1

f='/path/to/features[30,55].R'

find . -type f -name DONE \
    -exec sh -c 'echo cp "$1" "$(dirname "$2")"' sh "$f" {} ';'

Isso chama corretamente sh com um script que copia o arquivo nomeado para o diretório do arquivo DONE encontrado.

Remova o echo quando tiver certeza de que está fazendo a coisa correta.

Alternativamente,

find . -type f -name DONE \
    -execdir cp "$f" . ';'

... se o seu find tiver -execdir .

Seu problema foi triplo:

  1. O erro vem de deixar -c de sh -c , o que significa que sh estava tentando executar um script chamado cp /Users/perc... (todos como um único nome). Não encontrou este arquivo.

  2. O subshell também possui uma citação incorreta do nome do arquivo. Como contém caracteres globbing de nomes de arquivos, ele precisa ser citado.

  3. Colocar {} dentro do script é potencialmente perigoso ou pode ter pelo menos uma consequência confusa. Veja por exemplo o Solaris 10 encontra / -exec sh -c "echo {}" \; imprimir "{}" em vez de nomes de arquivos?

Sua segunda tentativa substituirá os arquivos DONE pelo conteúdo do script R. Aqui também, você deve citar o nome do arquivo do script R (isso não vai resolver isso).

    
por 04.09.2017 / 12:41