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 mkdir
chamadas 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 echo
que 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_dir
seja reescrito como um caminho absoluto):
cd src_dir && find -type d ...