我尝试递归比较本地主机上的目录和远程Linux机器上的目录,但是,当我执行下一个命令时:
diff -r 'ssh admin@10.0.0.10:/home/admin' /home/admin
它不工作说:diff: ssh admin@10.0.0.10:/home/admin: No such file or directory递归比较目录内容的正确方法是什么?先谢了
e4eetjau1#
如果你不需要比较文件中的细节,只需得到目录/文件名的差异,然后尝试以下操作:(Note:需要设置"无密码SSH登录",有关详细信息,请查看此URL:http://www.linuxproblem.org/art_9.html)
diff <(ssh admin@10.0.0.10 ls -R /home/admin) <(ls -R /home/admin)
lyfkaqu12#
尝试使用带有“-n”选项的“rsync”,它只是进行一次“预演”,并告诉您它将执行什么操作。
qltillow3#
您可以通过sshfs挂载远程目录,然后使用diff -r比较这两个目录。或者你可以在两台机器上运行类似的find命令来打印文件树(例如文件名、大小和日期),然后使用diff比较两台机器的输出。
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中继删除了一层。
ssh
hlswsv354#
基于@MarkSetchell的回答和下面的讨论:如果你想用rsync来做diff,这里有一个例子:
rsync --itemize-changes --dry-run --delete --links -r -c downloads/ user@192.168.1.2:/home/user/downloads/
sqxo8psd5#
对于以下所有示例,空文件夹无关紧要。如果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
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已经足够了。
icdiff
fxnxkyjh6#
我在命令末尾使用| less来提示交互式密码,使用sdiff是因为它比diff更容易阅读:因此,在本地和远程之间,键入:
| less
sdiff
sdiff -s <(find $dir -printf "%p\t%s\n" | sort) <(ssh server1 find $dir -printf '"%p\t%s\n"' | sort) | less
以及两台服务器之间的连接,请键入:
sdiff -s <(ssh server1 find $dir -printf '"%p\t%s\n"' | sort) <(ssh server2 find $dir -printf '"%p\t%s\n"' | sort) | less
其中$dir是要比较的完整目录路径。
$dir
irlmq6kh7#
如果你需要一个图形用户界面,我发现krusader对这样的任务非常有用。更多细节请参见https://www.linux.com/news/synchronize-directories-komparator-and-kdiff3。example folder compare
7条答案
按热度按时间e4eetjau1#
如果你不需要比较文件中的细节,只需得到目录/文件名的差异,然后尝试以下操作:
(Note:需要设置"无密码SSH登录",有关详细信息,请查看此URL:http://www.linuxproblem.org/art_9.html)
lyfkaqu12#
尝试使用带有“-n”选项的“rsync”,它只是进行一次“预演”,并告诉您它将执行什么操作。
qltillow3#
您可以通过
sshfs
挂载远程目录,然后使用diff -r
比较这两个目录。或者你可以在两台机器上运行类似的
find
命令来打印文件树(例如文件名、大小和日期),然后使用diff
比较两台机器的输出。注意
ssh
调用中printf格式字符串的双引号,ssh
中继删除了一层。hlswsv354#
基于@MarkSetchell的回答和下面的讨论:
如果你想用rsync来做diff,这里有一个例子:
sqxo8psd5#
对于以下所有示例,空文件夹无关紧要。
如果
ssh
不需要密码,而您希望查看这些文件如果
ssh
不需要密码,而您只想知道文件夹是否相同如果
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 $$; } &
所以...
如果远程主机上需要
sudo
你可以合并选项。
我推荐
icdiff
而不是diff
,但是diff
已经足够了。fxnxkyjh6#
我在命令末尾使用
| less
来提示交互式密码,使用sdiff
是因为它比diff
更容易阅读:因此,在本地和远程之间,键入:
以及两台服务器之间的连接,请键入:
其中
$dir
是要比较的完整目录路径。irlmq6kh7#
如果你需要一个图形用户界面,我发现krusader对这样的任务非常有用。更多细节请参见https://www.linux.com/news/synchronize-directories-komparator-and-kdiff3。
example folder compare