使用bash shell脚本比较不同目录中的文件

时间:2014-05-27 05:31:54

标签: linux bash loops mv

我创建了一个脚本,它会比较不同目录(rpmsnewrpms)中的两个文件。这两个目录由文件组成。在rpms/方面,它是旧版本文件,newrpms/中是更新的文件。所以在这个脚本中,主要目标是比较目录中的文件,如果有相同的名称文件删除旧的文件并用更新的文件替换它。

rpms/ - 此目录中的文件

firefox-24.5.0-1.el5_10.i386.rpm
firefox-24.5.0-1.el5_10.x86_64.rpm
java-1.6.0-openjdk-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-demo-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-devel-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-javadoc-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-src-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.7.0-openjdk-1.7.0.55-2.4.7.1.el5_10.x86_64.rpm
java-1.7.0-openjdk-debuginfo-1.7.0.55-2.4.7.1.el5_10.x86_64.rpm
java-1.7.0-openjdk-devel-1.7.0.55-2.4.7.1.el5_10.x86_64.rpm
java-1.7.0-openjdk-javadoc-1.7.0.55-2.4.7.1.el5_10.x86_64.rpm

newrpms/ - 需要替换rpms/目录中旧文件的更新文件

firefox-25.5.0-1.el5_10.i386.rpm
firefox-25.5.0-1.el5_10.x86_64.rpm
java-1.6.0-openjdk-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-demo-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-devel-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-javadoc-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm
java-1.6.0-openjdk-src-1.6.0.0-5.1.13.3.el5_10.x86_64.rpm

请参阅下面的脚本。

for i in $(\ls -d ./rpms/*);
do diff ${i} newrpms/; 
done

对于上面的代码,没有任何反应。任何人都可以帮我解决我的问题。我想要的是比较两个目录并获取相同的文件,当且仅当rpms/目录中没有newrpms/具有相同的文件时,移动它是非常容易理解的从newrpms/rpms/ nad,如果它们具有相同的文件名但只有很少一部分不相同。检查最新的一个。 离。

firefox-24.5.0-1.el5_10.i386.rpm --> in the rpms/
firefox-25.5.0-1.el5_10.i386.rpm --> in the newrpms/

所以最新的一个是newrpms/。移除firefox-24.5.0-1.el5_10.i386.rpm中的rpms/并将firefox-25.5.0-1.el5_10.i386.rpm移至rpms/

1 个答案:

答案 0 :(得分:1)

很难知道你的脚本出了什么问题。您确定新旧目录中的rmps之间存在差异吗?您是否尝试过报告相同文件的-s diff选项?

但无论如何,脚本对于您尝试执行的任务来说太复杂了。这应该是等效的命令:

diff rpms newrpms

如果一个目录中的文件在另一个目录中不存在,则会在输出中记录。并且还会报告二进制文件的差异。但你可能甚至不需要这样做。为什么不使用cp命令将文件从newrpms复制到rpms?或者,如果您想要更复杂,请使用rsync

rsync -av newrpms rpms

这将检查newrpms中的任何文件是否比rpms中的文件更新,并且仅在需要时执行复制。 (查看man rsync了解更多详情。)