Opção 1: volte no tempo e leia isto: link Isso usa um truque com hardlinks para otimizar a operação (observe cuidadosamente a omissão de "/" no exemplo, isso pode ser diferente do que você está acostumado). Se você tiver uma cópia de backup local antes da reorganização, talvez você possa restaurar e usar isso (a complicação é poder criar a cópia do hardlink conforme necessário).
Opção 2: se você não tiver espaços / citações em seus nomes de arquivos ou diretórios e não pretender manter nenhuma duplicação, poderá criar um script rápido e sujo de copiar / renomear como este.
Na fonte:
cd /wherever
find . -type f | xargs sha1sum | sort > /tmp/src.out
No destino
cd /wherever
find . -type f | xargs sha1sum | sort > /tmp/dst.out
Copie o arquivo dst.out
para a fonte e, em seguida, na origem:
join -j 1 /tmp/src.out /tmp/dst.out | while read sum src dst; do
if [ "$src" != "$dst" ]; then
echo mkdir -p $(dirname "$src")
echo cp -ipl "$dst" "$src"
fi
done > fixup.sh
Isso gerará um conjunto de comandos mkdir/cp
que você pode executar ( fixup.sh
) no diretório superior de sua cópia no destino. Certifique-se de que a saída do script faça o que você precisa para fazer . cp -ipl
não será substituído sem aviso e copiará por link físico. Um rsync --delete ...
subseqüente excluirá os arquivos antigos, supondo que deseja uma cópia idêntica. Use rsync --dry-run ...
depois para confirmar a extensão das diferenças restantes.
(É possível usar " mv -i
" em vez do não destrutivo " cp -ipl
", salvando a duplicação e a limpeza.)
Se você tem nomes de arquivos / diretórios problemáticos, você precisará fazer algum processamento intermediário de nomes de arquivos, ou tente uma das soluções aqui: link
Atualização:
Se você puder tolerar a explosão em uma fábrica de pontuação que passa por uma linha de comando sed
:
find . -type f -print0 | xargs -0 sha1sum |
sed -re $'s/(^[0-9a-z]*) /\1__/;
s/ /\\x20/g; s/\'/\\\'/g;
s/(^[0-9a-z]*)__/\1 /;
s/ (.*)$/ $\'\1\'/g;'
Isso manipulará espaços e aspas simples / duplas (embora estejamos nos aproximando de perl
territory para um trabalho pesado adequado). Ele usa a construção bash $''
para citar sequências problemáticas.