Tengo una estructura de carpetas con un montón de archivos * .csv dispersos por las carpetas. Ahora quiero copiar todos los archivos * .csv a otro destino manteniendo la estructura de carpetas.
Funciona haciendo:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
y así sucesivamente, pero me gustaría hacerlo usando un comando.

'{}'funciona igual de bien-execdires más seguro que-exec, simplemente reemplazar uno con el otro no conserva la estructura de la carpeta como se esperaba.También podrías usar
rsyncpara esto.Si desea mantener directorios vacíos del árbol de origen, omita la
--prune-empty-dirsopción:Si no desea que se conserven enlaces simbólicos, fechas de modificación, permisos de archivos, propietarios, etc., reemplácelos
-acon otra combinación de-rlptgoD. ;-)fuente
-mes un acceso directo para--prune-emty-dirs.-Rse puede agregar la opción para copiar la estructura del directorio principal de origen. (cf. mi respuesta aquí.)Puede usar find y cpio en modo de paso
Esto encontrará todos los archivos .csv en el directorio actual y debajo, y los copiará en / target manteniendo la estructura del directorio enraizada
..Si utiliza
encontrará todo el archivo en
/path/to/filesy debajo y los copiará en/target/path/to/filesy debajo.fuente
El
cpcomando permite múltiples argumentos de origen:CAVEAT: Estoy usando un globo recursivo aquí; Esta es la
globstaropción en Bash 4+ yksh, y es compatible por defecto enzsh. Los globos recursivos no coinciden con los archivos y carpetas ocultos, y algunas implementaciones siguen enlaces simbólicos mientras que otras no .Si su caparazón no admite globos recursivos, o si prefiere no usarlos, puede hacer lo siguiente:
*.csv */*.csv */*/*.csv */*/*/*.csv- esto es, por supuesto, muy redundante y requiere saber cuán profunda es la estructura de su directorio.$(find . -name '*.csv')- Esto va a coincidir con los archivos y carpetas ocultos.findtambién admite especificar si se siguen o no los enlaces simbólicos, lo que puede ser útil.fuente
shopt -s globstarinmediatamente antes de mi comando y todo está bien. ¡Gracias por el seguimiento!--parentsera lo que estaba buscando graciasEste funcionó para mí:
find -name "*.csv" | xargs cp --parents -t /targetfuente
find [things] | xargs [do stuff]es muy poderoso.find -print0yxargs -0.Suponiendo que desea replicar esta estructura de
./sourcea./destination:Estoy preparado para contar eso como una línea, el hecho de
cd sourceser un caparazón incorporado.fuente
tartiene la-Copción de evitar tener que cambiar primero el directorio.Desde
rsyncla página del manual:Entonces, esto también funcionaría:
fuente