我试图以递归方式将本地主机中的目录与远程linux机器中的目录进行比较。但是,当我执行下一个命令时:
diff -r 'ssh admin@10.0.0.10:/home/admin' /home/admin
它不起作用:
diff:ssh admin@10.0.0.10:/ home / admin:没有这样的文件或目录
以递归方式比较目录内容的正确方法是什么?
提前致谢
答案 0 :(得分:40)
如果您不需要在文件中区分细节,只需获取目录/文件名的区别,然后尝试:
(注意:需要设置“无密码的SSH登录”,详情请查看以下网址:http://www.linuxproblem.org/art_9.html)
diff <(ssh admin@10.0.0.10 ls -R /home/admin) <(ls -R /home/admin)
答案 1 :(得分:23)
尝试将“rsync”与“-n”选项一起使用,这只是“干运行”并告诉你它会做什么。
答案 2 :(得分:10)
您可以通过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
中继删除了一层。
答案 3 :(得分:0)
如果您需要GUI,我发现krusader对此类任务非常有用。 有关详细信息,请参阅https://www.linux.com/news/synchronize-directories-komparator-and-kdiff3 http://krusador.org。
答案 4 :(得分:-1)
对于下面的所有示例,空文件夹都无关紧要。
如果 ssh
不需要密码并且您想查看文件
diff -y -W250 \
<(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")
<(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort -k2")
如果 ssh
不需要密码,而您只想知道文件夹是否相同
diff -y -W250 \
<(ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
<(ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")
如果 ssh
需要密码
sshpass
包echo -n "Password: "; IFS= read -rs PASS < /dev/tty; trap 'unset PASS; echo "PASS has been cleared"; trap - USR1' USR1; { sleep 60; kill -USR1 $$; } &
所以...
diff -y -W250 \
<(sshpass -p "$PASS" ssh user@host1 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
<(sshpass -p "$PASS" ssh user@host2 "find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")
如果远程主机上需要 sudo
diff -y -W250 \
<(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum") \
<(ssh user@host1 "echo \"$PASS\" | sudo -S find /jbossas/modules -type f | xargs -I{} md5sum {} | sort | md5sum")
并且您可以合并选项。
我推荐 icdiff
而不是 diff
,但 diff
就足够了。