Como copiar a hierarquia de diretórios (omitindo arquivos) em um diretório diferente?

Como copiar a hierarquia de diretórios (omitindo arquivos) em um diretório diferente?

Tenho um diretório com subdiretórios que gostaria de copiar para um diretório diferente. Minha abordagem ingênua atual é assim:

find src_dir -type d -exec mkdir -p dest_dir/{} \;

Funciona, mas faz muitas mkdirchamadas redundantes, e também em sequência.

Tentei estes também para referência:

# 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 uma maneira melhor com menos redundância e menos chamadas executivas?

Responder1

Usando rsync e filtragem (-f) você pode filtrar os diretórios e filtrar todo o resto, assim:

rsync -av -f "+ */" -f "- *" src_dir/ new_dir/

Responder2

Você pode alterar o ;para +para find ... -exec, reduzindo o número de chamadas de processo. Nesta situação você precisa usar um pequeno pedaço de shell para desenrolar a lista de diretórios que serão passados:

find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +

Remova os dois casos em echoque você está satisfeito porque tudo funcionará conforme o esperado. (Observe em particular que você terminará com dest_dir/src_dir/...; se não quiser isso, use este tipo de construção, lembrando-se de garantir que dest_dirseja reescrito como um caminho absoluto):

cd src_dir && find -type d ...

informação relacionada