2014-09-23 102 views
1

我想比较本地和远程目录,并确定远程目录中不存在的文件或不同的校验和文件。Bash本地和远程目录比较

目标是让脚本返回要迭代的文件列表。到目前为止,我有以下,但它不是最好的。

rsync -avnc /path/to/files [email protected]:/path/to/files/ | grep -v "sending incremental file list" | grep -v "bytes received" | grep -v "total size is" | grep -v "./" 

我刚刚使用管道grep -v调用删除我不关心的位。有没有更好的方法来比较使用SSH的本地和远程目录?看起来他们应该是。重要的限制是我必须在两台独立的机器上比较目录。

+0

如果你想使生活更容易,看看[**如何通过ssh **来区分目录](http://stackoverflow.com/questions/20969124/how-to-diff-directories-over-ssh) – 2014-09-23 05:34:03

回答

0

我会这样做,使用一对匹配的find调用和致电​​comm

# comm -3 produces two-column output, skipping lines in common. 
comm -3 <(find $LOCALDIR | sort) <(ssh [email protected] find $REMOTEDIR | sort) 

如果你写你的本地和远程输出到临时文件,可以轻松打印任何系统上丢失的文件的列表;在你的find命令中有一点聪明,你可能会比较两个系统之间的文件校验和。

请注意,此解决方案使用基于行的文本比较,因此不能免疫奇怪的文件名。如果需要使用换行符或其他特殊字符处理文件名,则可能需要调查更聪明的解决方案(可能涉及find ... -print0)。

1
comm -3 <(ls -l /path/to/files | awk '{print $5"\t"$9}' | sort) <(ssh [email protected] ls -l /path/to/files | awk '{print $5"\t"$9}' | sort) 

$5是大小

$9是文件名

然后,打印文件只存在于远程服务器