usando find, exec y cp para copiar archivos específicos conservando la ruta del directorio

usando find, exec y cp para copiar archivos específicos conservando la ruta del directorio

Configuré las siguientes carpetas con archivos de texto vacíos:

1/a.txt
2/b.txt

Quiero copiar solo archivos txt a otro directorio manteniendo su estructura de directorios. Entonces probé los siguientes comandos:

mkdir -p temp/s;
find ./ -name '*txt' -exec cp --parents '{}' ./temp/s \;

Ahora veo los siguientes archivos de mi directorio actual:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt
temp/s/temp/s/2/b.txt

No entiendo por qué temp/s/temp/s/2/b.txtapareció la línea final. ¿Alguien puede explicarme por qué sucedió eso y cómo puedo arreglar mi comando para que tempno esté anidado dentro de otro temp?

Este es el resultado final que esperaba:

1/a.txt
2/b.txt
temp/s/1/a.txt
temp/s/2/b.txt

Respuesta1

Usted tiene uncondición de carrera: ya que temp/sestá en findla ruta de búsqueda de , findenumera archivos, mientras que los cps generados agregan nuevos archivos.

Debe excluir el subdirectorio mientras ejecuta find:

find . -path ./temp/s -prune -o -name '*txt' -exec cp --parents '{}' ./temp/s \;

Tenga en cuenta que reemplazar \;con +generará muchos menos cpprocesos.

información relacionada