Acho que tentaria colocar algo em conjunto usando o rsync
no modo dry-run ( --dry-run
ou -n
).
Para ilustrar, dado:
$ tree -Ds Adir/ Bdir/
Adir/
├── [ 4096 Nov 19 9:36] sub1
│ ├── [ 35 Nov 19 9:35] common
│ └── [ 23 Nov 19 9:36] onlyA
├── [ 4096 Nov 19 9:41] sub2
│ ├── [ 35 Nov 19 9:35] common
│ ├── [ 44 Nov 19 9:44] newerA
│ ├── [ 44 Nov 19 9:37] olderA
│ └── [ 6 Nov 19 10:36] size
└── [ 4096 Nov 19 9:35] sub3
└── [ 35 Nov 19 9:35] common
Bdir/
├── [ 4096 Nov 19 9:46] sub1
│ └── [ 35 Nov 19 9:35] common
├── [ 4096 Nov 19 10:36] sub2
│ ├── [ 35 Nov 19 9:35] common
│ ├── [ 44 Nov 19 9:38] newerA
│ ├── [ 44 Nov 19 9:44] olderA
│ └── [ 24 Nov 19 10:36] size
└── [ 4096 Nov 19 9:40] sub3
├── [ 35 Nov 19 9:35] common
└── [ 23 Nov 19 9:40] onlyB
6 directories, 14 files
podemos listar arquivos com tamanhos ou tempos de modificação diferentes da seguinte forma:
$ rsync -aOn --delete --itemize-changes Adir/ Bdir/
*deleting sub3/onlyB
>f+++++++++ sub1/onlyA
>f..t...... sub2/newerA
>f..t...... sub2/olderA
>f.s....... sub2/size
[A string de mudança não importa realmente para nossos propósitos, mas por exemplo *deleting
indica que sub3/onlyB
não está presente no diretório de origem; s
indica uma diferença de tamanho; t
indica uma diferença no tempo de modificação.]
Infelizmente, não parece ser possível obter os timestamps reais diretamente da saída rsync, mas podemos simplesmente ler a lista de arquivos e declarar os arquivos correspondentes em cada diretório:
#!/bin/bash
dirA="$1"
dirB="$2"
rsync -aOn --itemize-changes --delete "$dirA"/ "$dirB"/ | while read -r c f ; do
printf '%s:%s ' "$dirA" "$(cd "$dirA" && stat -c '%n %s %y' "$f" 2>/dev/null || printf '(none) - - - -')"
printf '%s:%s\n' "$dirB" "$(cd "$dirB" && stat -c '%n %s %y' "$f" 2>/dev/null || printf '(none) - - - -')"
done
que podemos usar da seguinte forma
$ ./rstat.sh Adir Bdir | column -t
Adir:(none) - - - - Bdir:sub3/onlyB 23 2016-11-19 09:40:12.253318393 -0500
Adir:sub1/onlyA 23 2016-11-19 09:36:52.220421434 -0500 Bdir:(none) - - - -
Adir:sub2/newerA 44 2016-11-19 09:44:45.953236221 -0500 Bdir:sub2/newerA 44 2016-11-19 09:38:33.270838033 -0500
Adir:sub2/olderA 44 2016-11-19 09:37:41.675642039 -0500 Bdir:sub2/olderA 44 2016-11-19 09:44:45.953236221 -0500
Adir:sub2/size 6 2016-11-19 10:36:31.460487036 -0500 Bdir:sub2/size 24 2016-11-19 10:36:31.460487036 -0500