Isso faz todo o trabalho de uma só vez - em todos os diretórios filhos, tudo em um único fluxo sem nenhum problema de nome de arquivo. Ele copia do menor para o maior todo arquivo que você tem. Você precisará mkdir ${DESTINATION}
, se ainda não existir.
find . ! -type d -print0 |
du -b0 --files0-from=/dev/stdin |
sort -zk1,1n |
sed -zn 's/^[^0-9]*[0-9]*[^.]*//p' |
tar --hard-dereference --null -T /dev/stdin -cf - |
tar -C"${DESTINATION}" --same-order -xvf -
Você sabe o que, no entanto? O que isto não faz é vazio diretórios filho. Eu poderia fazer algum redirecionamento sobre esse pipeline, mas é apenas uma condição de corrida esperando para acontecer. O mais simples é provavelmente o melhor. Então faça isso depois:
find . -type d -printf 'mkdir -p "'"${DESTINATION}"'/%p"\n' |
. /dev/stdin
Ou, como Gilles faz um bom argumento em sua resposta para preservar as permissões de diretório, eu deveria tentar também. Eu acho que isso vai fazer isso:
find . -type d -printf '[ -d "'"${DESTINATION}"'/%p" ] ||
cp "%p" -t "'"${DESTINATION}"'"\n' |
. /dev/stdin
Eu estaria disposto a apostar que é mais rápido que mkdir
de qualquer maneira.