2014-01-07 95 views
33

我想递归比较本地主机中的目录到远程Linux机器中的目录。然而,当我执行的下一个命令:如何通过SSH区分目录

diff -r 'ssh [email protected]:/home/admin' /home/admin 

这是行不通的说:

DIFF:SSH [email protected]:/首页/管理员:没有这样的文件或目录

什么是递归比较目录内容的正确方法?

在此先感谢

+1

相关:http://serverfault.com/questions/59140/how-do-diff-over-ssh – fedorqui

+1

这个链接将告诉您如何比较文件。它不能用于比较dirs –

回答

30

如果不需要中DIFF文件中的细节,只是让DIR /文件名的差异,那么试试这个:

(注:需要设置“SSH登录无密码”,详细介绍,请查看本网址:http://www.linuxproblem.org/art_9.html

diff <(ssh [email protected] ls -R /home/admin) <(ls -R /home/admin) 
+2

,因为第二个运算符<它将输出作为密码进行隧道传输,所以会自动应答: diff <(ssh [email protected] find/home/admin -printf'“%8s%p \ n”')<(find/home/admin -printf'%8s%p \ n') 此系统仅供授权使用。 [email protected]的密码: 权限被拒绝,请重试。 [email protected]的密码: 权限被拒绝,请重试。 [email protected]的密码: 权限被拒绝(公钥,密码)。 –

+0

您需要首先为SSH会话设置非密码 – BMW

+0

我更新了我的答案,请查看此URL http://www.linuxproblem.org/art_9.html – BMW

15

尝试使用“rsync的”用“-n”选项,它只是做一个“预演”,并告诉你那是什么会做。

+3

'-c'会告诉rsync查看校验和,而不仅仅是日期和长度 – Mike

+3

'--delete'是需要的。没有它,你将不会看到第二台机器上存在的任何文件,但不会在第一台上。确保你有空运行'-n'选项。 – JellicleCat

+1

当然你也需要'-r'或'-a'来递归,并且不要忘记在目录名称后面加上反斜杠(但是没有星号),否则''delete'不会返回任何东西删除。所以你的命令是'rsync -e'ssh -p 22'-azvn --delete [email protected]:/ home/admin// home/admin /'。 – TNT

9

您可以通过sshfs挂载远程目录,然后您可以使用diff -r来比较这两个目录。

或者,您可以在两台机器上运行类似的find命令来打印文件树(例如文件名,大小和日期),然后使用diff比较两者的输出。这不是比较文件的内容,当然是:

diff <(ssh host find /home/admin -printf '"%8s %P\n"') \ 
    <(find /home/admin -printf '%8s %P\n') 

注意双引号的ssh调用的printf格式字符串。一层被ssh中继去除。

+0

您可能会发现''find'命令的输出在通过'diff'进行比较之前是有用的。在这种情况下,我会使用路径作为输出中的第一个元素:'<(find/home/admin -printf“%p%s \ n”| sort)' – Alfe

+1

%p比%p更好,所以你可以diff目录在每个服务器上的不同文件夹中 – reox

+0

感谢@reox,我相应地更改了我的答案。实际上,我通常在'(cd dir; find)中使用它。-printf ...)'在这种情况下,是否使用'%p'或'%P'没有什么区别。它在这里。 – Alfe