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'

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


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 \;

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.


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


-2

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.