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-execdir
es 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
rsync
para esto.Si desea mantener directorios vacíos del árbol de origen, omita la
--prune-empty-dirs
opción:Si no desea que se conserven enlaces simbólicos, fechas de modificación, permisos de archivos, propietarios, etc., reemplácelos
-a
con otra combinación de-rlptgoD
. ;-)fuente
-m
es un acceso directo para--prune-emty-dirs
.-R
se 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/files
y debajo y los copiará en/target/path/to/files
y debajo.fuente
El
cp
comando permite múltiples argumentos de origen:CAVEAT: Estoy usando un globo recursivo aquí; Esta es la
globstar
opció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.find
también admite especificar si se siguen o no los enlaces simbólicos, lo que puede ser útil.fuente
shopt -s globstar
inmediatamente antes de mi comando y todo está bien. ¡Gracias por el seguimiento!--parents
era lo que estaba buscando graciasEste funcionó para mí:
find -name "*.csv" | xargs cp --parents -t /target
fuente
find [things] | xargs [do stuff]
es muy poderoso.find -print0
yxargs -0
.Suponiendo que desea replicar esta estructura de
./source
a./destination
:Estoy preparado para contar eso como una línea, el hecho de
cd source
ser un caparazón incorporado.fuente
tar
tiene la-C
opción de evitar tener que cambiar primero el directorio.Desde
rsync
la página del manual:Entonces, esto también funcionaría:
fuente