Tengo un directorio con subdirectorios que me gustaría copiar en un directorio diferente. Mi enfoque ingenuo actual es el siguiente:
find src_dir -type d -exec mkdir -p dest_dir/{} \;
Funciona, pero realiza muchas mkdir
llamadas redundantes y además en secuencia.
También he probado estos como referencia:
# real fast
find src_dir -type d >/dev/null
# also real fast
find src_dir -type d -exec true {} +
# slower, but not as slow as mkdir
find src_dir -type d -exec true {} \;
¿Existe una manera mejor con menos redundancia y menos llamadas ejecutivas?
Respuesta1
Usando rsync y filtrando (-f) puedes filtrar en los directorios y filtrar todo lo demás, así:
rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
Respuesta2
Puede cambiar a ;
por +
, find ... -exec
reduciendo la cantidad de llamadas a procesos. En esta situación, necesita usar un pequeño fragmento de shell para desenrollar la lista de directorios que se pasarán:
find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +
Elimine los dos casos en echo
los que esté satisfecho de que funcionará como se esperaba. (Tenga en cuenta en particular que terminará con dest_dir/src_dir/...
; si no quiere eso, use este tipo de construcción en su lugar, recordando asegurarse de que dest_dir
se reescriba como una ruta absoluta):
cd src_dir && find -type d ...