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'
shantanuo
fuente

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

malcolmpdx
fuente
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 \;
Thiyagu ATR
fuente
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.

Ignacio Vazquez-Abrams
fuente
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
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Robert A
fuente
-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

John Sebin
fuente
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