Aviso: essa resposta não funcionará em sistemas de arquivos que não oferecem suporte a links físicos (por exemplo, FAT).
Outra opção (que pode ser mais portável) é
cd source_directory find . -type f -print0 | cpio --pass-through --null --link --make-directories dest_dir
cpio
(copiar em & fora) é um dinossauro anterior a tar
.
Como tar
, ele pode criar ou extrair arquivos.
Ao contrário de tar
(corrija-me se estiver errado)
ele pode copiar árvores de diretórios com um único comando.
(Eu acho que você poderia fazer isso com tar -cf - source option(s) and arguments(s) | tar -xf - destination option(s) and arguments(s)
.)
Isso é o que --pass-through
significa.
--null
significa “esperar que nomes de arquivos sejam delimitados por nulos”;
isto é, leia a saída de find … -print0
.
--link
significa "vincular arquivos do diretório de origem ao diretório de destino,
se possível".
--make-directories
não precisa de explicação.
Isso pode ser abreviado como cpio –p0ld dest_dir
.
Adicione --verbose
ou -v
, se desejar.
Então, depois disso,
- Verifique as colisões e manuseie adequadamente.
- Verifique se o seu diretório de destino está preenchido com links físicos.
- Remova o diretório de origem.