Encontre e copie arquivos

128

Por que o seguinte não copia os arquivos para a pasta de destino?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
shantanuo
fonte

Respostas:

273

Se sua intenção é copiar os arquivos encontrados em / home / shantanu / tosend, a ordem dos argumentos para cp será revertida:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Nota: o comando find usa {} como espaço reservado para o arquivo correspondente

malcolmpdx
fonte
14
Qual é o propósito \;?
Astrid
5
@Astrid verifique isto
shellbye
find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;há algo de errado com este comando? não está funcionando #
2100 mrid
2
Não funciona se os resultados tiverem um espaço no caminho. Alguma sugestão para isso?
TheJeff 22/09
1
No Ubuntu 18, as chaves também precisam ser colocadas entre aspas simples: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
P6majo 11/06/19
32

eu enfrentei um problema algo como isto ...

Na verdade, de duas maneiras, você pode processar a findsaída do copycomando no comando

  1. Se finda saída do comando não contiver nenhum espaço, ou seja, se o nome do arquivo não contiver espaço, você poderá usar o comando abaixo mencionado:

    Sintaxe: find <Path> <Conditions> | xargs cp -t <copy file path>

    Exemplo: find -mtime -1 -type f | xargs cp -t inner/

  2. Mas na maioria das vezes nossos arquivos de dados de produção podem conter espaço nele. Portanto, a maior parte do tempo abaixo do comando mencionado é mais segura:

    Sintaxe: find <path> <condition> -exec cp '{}' <copy path> \;

    Exemplo find -mtime -1 -type f -exec cp '{}' inner/ \;

No segundo exemplo, a última parte, ou seja, ponto-e-vírgula, também é considerada como parte do findcomando, que deve ser escapada antes de pressionar o botão Enter. Caso contrário, você receberá um erro semelhante a este

find: missing argument to `-exec'

No seu caso, a sintaxe do comando copy está incorreta para copiar o arquivo find /home/shantanu/tosend. O seguinte comando funcionará:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Thiyagu ATR
fonte
3. Se você tiver GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Exemplo:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight
7

Você precisa usar cp -t /home/shantanu/tosendpara dizer que o argumento é o diretório de destino e não uma fonte. Você pode, então alterá-lo para -exec ... +a fim de obter cppara copiar tantos arquivos quanto possível ao mesmo tempo.

Ignacio Vazquez-Abrams
fonte
2
No Linux tinha que especificar o diretório de destino assim: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
gurum
3
Esta resposta poderia ser melhorada e reduzida se o comando completo fosse fornecido como na resposta superior.
Brian
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A
fonte
-2

A razão para esse erro é que você está tentando copiar uma pasta que requer a opção -r também para cp

Sebin John
fonte
3
Olá, como a pergunta já foi respondida (há algum tempo), essa não é realmente uma resposta relevante, mas também deve ser um comentário (quando você tiver mais algum representante), a menos que queira expandir e explicar. Apenas um aviso: :).
W1ll1amvl