Para a versão 3.3 ou posterior diff
, você deve usar a --no-dereference
opção, conforme descrito na resposta de Pete Harlan .
Infelizmente, versões mais antigas diff
do não suportam ignorar links simbólicos :
Alguns arquivos não são diretórios nem arquivos regulares: são arquivos incomuns, como links simbólicos, arquivos especiais de dispositivos, pipes nomeados e soquetes. Atualmente, diff
trata links simbólicos como arquivos regulares; trata outros arquivos especiais, como arquivos regulares, se forem especificados no nível superior, mas simplesmente relata sua presença ao comparar diretórios. Isso significa que patch
não pode representar alterações nesses arquivos. Por exemplo, se você alterar para qual arquivo um link simbólico aponta, diff
gera a diferença entre os dois arquivos, em vez da alteração no link simbólico.
diff
opcionalmente, deve relatar alterações em arquivos especiais e patch
deve ser estendido para entender essas extensões.
Se tudo o que você deseja é verificar um rsync (e presumivelmente corrigir o que está faltando), execute o comando rsync pela segunda vez. Se você não quiser fazer isso, a soma do diretório pode ser suficiente.
Se você realmente deseja fazer isso diff
, pode find
pular os links simbólicos e executar o diff em cada arquivo individualmente. Passe seus diretórios a e b em 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 uma linha:
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 inteiro, isso não notará se os nomes dos links simbólicos não estiverem presentes em b . Se você exigisse isso, seria necessário um segundo passe de localização para identificar todos os links simbólicos e, em seguida, verificar explicitamente a existência deles 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 seu
rsync
cenário.