2014-02-18 42 views
2

有谁知道如何列出存在于一个远程文件夹中但不在另一个远程文件夹中的文件。我有两台服务器(比如Server1和Server2),它们具有类似的文件夹结构,我在做Rsync。但是,由于某些文件被删除,目标文件夹中的文件比源文件多。现在,我试图通过服务器1和服务器之间使用diff找到一种方法找到该文件在Server2是新2通过SSH在两个远程文件夹之间的差异

我可以取两个本地文件夹之间的差异直接使用以下命令:

diff /home/www/images/test_images /var/www/site/images/test_images 

但我想知道是否有可能使用ssh在两台远程服务器之间区分文件夹。喜欢这个?

diff [email protected]:/home/www/images/test_images [email protected]:/var/www/site/images/test_images 

说是服务器1和服务器2的SSH配置如下:

服务器1

IP: images.server1.com 
User: ubuntu1 
Password: pa$$word1 
Images Path: /home/www/images/test_images 

服务器2

IP: images.server2.com 
User: ubuntu2 
Password: pa$$word2 
Images Path: /var/www/site/images/test_images 

盼望任何他lp来解决这个问题。谢谢。

+0

也许:-) http://malcontentcomics.com/systemsboy/2006/07/send-remote-commands-via-ssh.html – Leo

回答

5

试试这个命令:

diff -B <(sshpass -p 'pa$$word1' ssh [email protected] "find /home/www/images/test_images -type f | sed 's/\/home\/www\/images\/test_images\///g'" | sort -n) <(sshpass -p 'pa$$word2' ssh [email protected] "find /var/www/site/images/test_images -type f | sed 's/\/var\/www\/site\/images\/test_images\///g'" | sort -n) | grep ">" | awk '{print $2}' 

说明:

可以使用diff -B <() <()采取两个流之间的差异。该命令首先使用sshpass ssh进入两台服务器,而不必交互输入密码。

diff -B每个参数使用find命令递归列出指定目录下的所有图片,并使用sed删除文件的根路径(因为它们是不同的两个服务器 - 并使它成为diff命令工作);和sort命令来排序它们。

由于diff命令返回任一><grep的输出被用来从服务器2最后仅过滤出的diff,awk打印出仅第二柱(除去来自输出的>列)。

注意:您需要先安装sshpass。使用apt-get如下安装它:

sudo apt-get install sshpass 

您可以通过管道像rm其他命令来扩展此。希望这对你有用。

+1

非常感谢您的解释。你解决了我的问题,我只是添加了一个nohup'你的命令',因为它花费了很多时间在后台运行,因为我正在测试超过1,000,000个图像......太棒了! – Sergio