¿Cómo copiar la jerarquía de directorios (omitiendo archivos) en un directorio diferente?

¿Cómo copiar la jerarquía de directorios (omitiendo archivos) en un directorio diferente?

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 mkdirllamadas 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 ... -execreduciendo 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 echolos 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_dirse reescriba como una ruta absoluta):

cd src_dir && find -type d ...

información relacionada