En unix, quiero copiar todos los archivos con una determinada extensión (todos los archivos de Excel) de todos los subdirectorios a otro directorio. Tengo el siguiente comando:
cp --parents `find -name \*.xls*` /target_directory/
Los problemas con este comando son:
También copia la estructura del directorio, y solo quiero los archivos (por lo que todos los archivos deberían terminar en / target_directory /)
No copia archivos con espacios en los nombres de archivo (que son bastantes)
¿Alguna solución para estos problemas?

find... exec mv?Respuestas:
--parentsestá copiando la estructura del directorio, por lo que debería deshacerse de eso.La forma en que ha escrito esto, se
findejecuta y la salida se coloca en la línea de comando de manera quecpno se puede distinguir entre los espacios que separan los nombres de archivo y los espacios dentro del nombre de archivo. Es mejor hacer algo comoen el que
cpse ejecuta para cada nombre de archivo quefindencuentra, y pasa el nombre de archivo correctamente. Aquí hay más información sobre esta técnica.En lugar de todo lo anterior, puede usar zsh y simplemente escribir
zshpuede expandir comodines para incluir subdirectorios y hace que este tipo de cosas sea muy fácil.fuente
Bash4.0+ yksh93también es compatible**. Para bash, useshopt -s globstarpara habilitarlo. Para ksh, esset -Goset -o globstar.find . -name '*.xls' -print0 | xargs -0 cp -t destdirDe todo lo anterior, se me ocurrió esta versión. Esta versión también me funciona en la terminal de recuperación de mac.
Buscará en el directorio actual y de forma recursiva en todos los subdirectorios los archivos con la extensión xsl. Los copiará todos al directorio de destino.
Las banderas de cp son:
fuente
Tuve un problema similar. Lo resolví usando:
El
'{}'y";"ejecuta la copia de cada archivo.fuente
También tuve que hacer esto yo mismo. Lo hice a través del argumento --parents para cp:
fuente
puede eliminar los --parents, pero existe el riesgo de colisión si varios archivos tienen el mismo nombre.
fuente