Trova e copia file


128

Perché quanto segue non copia i file nella cartella di destinazione?

# 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'

Risposte:


273

Se il tuo intento è quello di copiare i file trovati in / home / shantanu / tosend hai l'ordine degli argomenti da cp invertiti:

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

Nota: trova il comando usa {} come segnaposto per il file corrispondente


14
Qual è lo scopo di \;?
Astrid,

5
@Astrid controlla questo
shellbye il

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;c'è qualcosa di sbagliato in questo comando? non funziona
mrid

2
Non funziona se i risultati hanno uno spazio nel percorso. Qualche suggerimento per questo?
TheJeff

1
In Ubuntu 18 anche le parentesi graffe devono essere inserite tra virgolette singole: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo,

32

ho affrontato un problema simile a questo ...

In realtà, in due modi è possibile elaborare l' findoutput del copycomando nel comando

  1. Se findl'output del comando non contiene alcuno spazio, ad esempio se il nome del file non contiene spazio al suo interno, è possibile utilizzare il comando di seguito indicato:

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

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

  2. Ma la maggior parte delle volte i nostri file di dati di produzione potrebbero contenere spazio al suo interno. Quindi il più delle volte il comando sotto riportato è più sicuro:

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

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

Nel secondo esempio, anche l'ultima parte, ad esempio il punto e virgola, è considerata parte del findcomando, che deve essere evasa prima di premere il pulsante Invio. Altrimenti otterrai un errore simile a questo

find: missing argument to `-exec'

Nel tuo caso, la sintassi del comando copia è errata per copiare il file find in /home/shantanu/tosend. Il seguente comando funzionerà:

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

3. Se si dispone di GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Esempio:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight,

7

È necessario utilizzare cp -t /home/shantanu/tosendper dire che l'argomento è la directory di destinazione e non una fonte. È quindi possibile modificarlo -exec ... +in per cppoter copiare il maggior numero possibile di file contemporaneamente.


2
In Linux ha dovuto specificare la directory di destinazione in questo modo: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
Questa risposta potrebbe essere migliorata e abbreviata se il comando completo fosse fornito come nella risposta in alto.
Brian


-2

Il motivo di questo errore è che stai provando a copiare una cartella che richiede l'opzione -r anche per cp Grazie


3
Ciao, poiché alla domanda è già stata data risposta (da tempo) questa non è in realtà una risposta pertinente, dovrebbe anche essere un commento (quando hai qualche rappresentante in più), a meno che tu non voglia espanderlo e spiegarlo. Solo un avviso :).
W1ll1amvl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.