it-swarm-es.com

¿Cómo se copia correctamente un archivo en múltiples carpetas y subcarpetas sin sobrescribir el contenido del archivo en las carpetas de destino?

En realidad probé una respuesta existente de: ¿Cómo copiar un archivo a varias carpetas usando la línea de comando? donde usé el comando:

find folder -exec cp file.txt {} \;

Quería usar esto porque quería copiar un archivo llamado 'file.txt' a un directorio llamado 'carpeta' y todos sus subdirectorios sin mencionar todos los directorios en el comando.

Sin embargo, lo que esto terminó haciendo fue reemplazar el contenido de cada archivo en 'carpeta' y sus subcarpetas con el contenido de 'file.txt'. Por ejemplo, si hubiera una carpeta interna 'foo.txt', aún conservaría el nombre 'foo.txt' pero todo su contenido sería reemplazado por el de 'file.txt'. Esto me dejó perplejo y probé la siguiente bandera interactiva:

find folder -exec cp -i file.txt {} \;

y recibí instrucciones de sobrescritura para cada archivo en el directorio 'carpeta' y todos sus subdirectorios, a pesar de que los nombres eran diferentes.

¿Puede alguien ayudarme a descubrir qué está pasando y cuál debería ser el comando apropiado?

1
Shudipto Amin

Debe restringir find a la lista de directorios :

_find folder -type d -exec cp file.txt {} \;
_

Además, en el futuro, cuando esté cp 'en un directorio donde el nombre del directorio proviene de algún otro comando, use la opción _-t_ para asegurarse de que realmente sea un directorio:

_find folder -type d -exec cp -t {} file.txt \;
_

De man cp :

_-t, --target-directory=DIRECTORY
      copy all SOURCE arguments into DIRECTORY
_

Entonces, si se proporciona un archivo como argumento para _-t_, cp se quejará automáticamente.

Otra respuesta a esa pregunta usa _-type d_.

1
muru