#!/bin/sh
cd path1
find . -type f -exec ls -i {} + | sort -k2 > ~/path1.lst
cd path2
find . -type f -exec ls -i {} + | sort -k2 > ~/path2.lst
cd ~
diff -U0 path1.lst path2.lst
Atualmente, estou usando um script para fazer backup de arquivos no meu computador.
Em poucas palavras, funciona assim:
rsync --link-dest=$FOLDER/current $SOURCE $DESTINATION
No entanto, acho que meu script pode estar duplicando alguns arquivos em vez de vinculá-los. Gostaria de verificar quais arquivos são (ou não) detectados como duplicados. Eu sei que o arquivo foi hardlinked corretamente dos dois arquivos compartilham o mesmo inode.
Como posso fazer um diff de duas pastas por inodes?
#!/bin/sh
cd path1
find . -type f -exec ls -i {} + | sort -k2 > ~/path1.lst
cd path2
find . -type f -exec ls -i {} + | sort -k2 > ~/path2.lst
cd ~
diff -U0 path1.lst path2.lst
Se eu entendi corretamente, seus arquivos de backup são armazenados com duplicatas. Eu acho que você pode adicionar ao script date stamp ou / e checksum, como md5sum. Por exemplo:
DESTINATION="(date +%F-%H-%M).foo-files"
#!/bin/sh
### Checking md5 hash ###
x='foo'
y='bar'
z='echo $x | /usr/bin/md5sum'
a='echo $y | /usr/bin/md5sum'
if [ "$z" = "$a" ];then
echo '=-=-=-Stuff_duplicate-=-=-='
. . .
fi
Aviso: o hash MD5 será alterado se apenas um ou mais símbolos forem diferentes em dois arquivos.
Boa sorte! =)
Não tenho certeza se entendi corretamente o que você quer dizer, mas quando menciona o link físico, espero que você queira dizer hardlink entre os backups e não os arquivos originais e de backup.
Você pode descobrir quais arquivos têm o mesmo inode com find.
find dest_dir -samefile orig_dir/file
este comando fornecerá uma lista de arquivos que corresponde ao mesmo inode que o original.
Se você colocar isso dentro de um loop, você pode fazer algo semelhante a
for i in 'ls orig_dir'
do
result='find dir2/ -samefile dir1/firstfile'
if [ result != "" ]
then
echo "Duplicate: " $i
fi
done
Isso imprimirá todos os arquivos que são hardlink entre o diretório original e o diretório de destino por inode. Observe que estou realizando o if com base na saída, pois o find sempre retorna true usando esses sinalizadores. da página man.
All options always return true. Except for -daystart, -follow and -regextype
Você pode usar os parâmetros -v
(verbose) e -n
(dry run) no comando rsync
para simular e visualizar as alterações no arquivo.
rsync -van src_dir/ dest_dir/ --delete
Observe que o rsync anterior a 1.0.1 não funciona bem quando o arquivo existe no diretório de destino e link-dest
dir.