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:
--parents
está copiando la estructura del directorio, por lo que debería deshacerse de eso.La forma en que ha escrito esto, se
find
ejecuta y la salida se coloca en la línea de comando de manera quecp
no 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
cp
se ejecuta para cada nombre de archivo quefind
encuentra, 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
zsh
puede expandir comodines para incluir subdirectorios y hace que este tipo de cosas sea muy fácil.fuente
Bash
4.0+ yksh93
también es compatible**
. Para bash, useshopt -s globstar
para habilitarlo. Para ksh, esset -G
oset -o globstar
.find . -name '*.xls' -print0 | xargs -0 cp -t destdir
De 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