Encuentra y copia archivos


128

¿Por qué lo siguiente no copia los archivos a la carpeta 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'

Respuestas:


273

Si su intención es copiar los archivos encontrados en / home / shantanu / tosend, tiene el orden de los argumentos para invertir cp:

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

Nota: el comando find usa {} como marcador de posición para el archivo coincidente


14
¿Para qué sirve \;?
Astrid

55
@Astrid revisa esto
hasta el

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;¿Hay algo malo con este comando? no está funcionando
mrid

2
No funciona si los resultados tienen un espacio en el camino. ¿Alguna sugerencia para esto?
TheJeff

1
En Ubuntu 18, las llaves también deben ponerse entre comillas simples: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

Me enfrenté a un problema como este ...

En realidad, de dos maneras puede procesar la findsalida del copycomando en el comando

  1. Si findla salida del comando no contiene ningún espacio, es decir, si el nombre del archivo no contiene espacio, puede usar el comando mencionado a continuación:

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

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

  2. Pero la mayoría de las veces nuestros archivos de datos de producción pueden contener espacio. Entonces, la mayoría de las veces el comando mencionado a continuación es más seguro:

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

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

En el segundo ejemplo, la última parte, es decir, el punto y coma, también se considera parte del findcomando, que se debe escapar antes de presionar el botón Intro. De lo contrario, obtendrá un error similar a este

find: missing argument to `-exec'

En su caso, la sintaxis del comando copiar es incorrecta para copiar el archivo de búsqueda en /home/shantanu/tosend. El siguiente comando funcionará:

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

3. Si usted tiene GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Ejemplo:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight,

7

Debe usarlo cp -t /home/shantanu/tosendpara decirle que el argumento es el directorio de destino y no una fuente. Luego puede cambiarlo a -exec ... +para poder cpcopiar tantos archivos como sea posible a la vez.


2
En Linux tenía que especificar el directorio de destino de la siguiente manera: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
Esta respuesta podría mejorarse y acortarse si se proporcionara el comando completo como en la respuesta superior.
Brian


-2

La razón de ese error es que está intentando copiar una carpeta que requiere la opción -r también para cp Gracias


3
Hola, como la pregunta ya está respondida (desde hace un tiempo), esta no es realmente una respuesta relevante, también debería ser un comentario (cuando tenga más representante), a menos que desee expandirlo y explicarlo. Solo un aviso :).
W1ll1amvl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.