Para a versão 3.3 ou posterior de diff
, você deve usar a opção --no-dereference
, conforme descrito na resposta de Pete Harlan .
Infelizmente, as versões mais antigas de diff
não suportam ignorar links simbólicos :
Some files are neither directories nor regular files: they are unusual files like symbolic links, device special files, named pipes, and sockets. Currently,
diff
treats symbolic links like regular files; it treats other special files like regular files if they are specified at the top level, but simply reports their presence when comparing directories. This means thatpatch
cannot represent changes to such files. For example, if you change which file a symbolic link points to,diff
outputs the difference between the two files, instead of the change to the symbolic link.
diff
should optionally report changes to special files specially, andpatch
should be extended to understand these extensions.
Se tudo que você quer é verificar um rsync (e presumivelmente consertar o que está faltando), então você poderia simplesmente executar o comando rsync uma segunda vez. Se você não quiser fazer isso, então check-somando o diretório pode ser suficiente.
Se você realmente quer fazer isso com diff
, então você pode usar find
para pular os links simbólicos, e executar o diff em cada arquivo individualmente. Passe seus diretórios a e b como argumentos:
#!/bin/bash
# Skip files in $1 which are symlinks
for f in 'find $1/* ! -type l'
do
# Suppress details of differences
diff -rq $f $2/${f##*/}
done
ou como um verso:
for f in 'find a/* ! -type l';do diff -rq $f b/${f##*/};done
Isso identificará arquivos que diferem em conteúdo ou arquivos que estão em a , mas não em b .
Observe que:
- Como estamos pulando links simbólicos por completo, isso não notará se os nomes dos links simbólicos não estiverem presentes em b . Se você precisasse disso, precisaria de um segundo passe de localização para identificar todos os links simbólicos e depois verificar explicitamente sua existência em b .
- Arquivos extras em b não serão identificados, pois a lista é construída a partir do conteúdo de a . Isso provavelmente não é um problema para o cenário
rsync
.