[英]linux (red hat) compare directories and copy over files that are different
[英]Compare files in two different directories in Linux
一个Shell脚本,它显示两个不同目录中多个文件的差异,并且还可能创建一个包含所有不匹配项的输出文件。
条件
文件dir1 / file1仅与dir2 / file1比较(其他文件类似-file2与file2比较)
如果发现任何变化:状态应为“例如文件file1中未找到匹配项”,所有其他文件也应执行相同操作,并将所有结果写入一个文件中
提前致谢
使用diff命令。 使用-r
标志,您可以递归比较文件夹:
diff -ur dir1 dir2
输出将采用patch
命令可以理解的格式。 您可以将其保存在文件中,然后使用以下命令将这些更改应用于dir1
diff -ur dir1 dir2 > my.patch
cd dir1
patch -p1 < ../my.patch
如果要处理文本文件,并且只想看一下差异,我将按照hek2mgl的建议自定义diff输出。 但是,如果您想获得更多控制权,例如在找到不同的文件后执行某些命令,或者必须比较二进制文件,则可以利用find
和cmp
。
下面是您可以自定义的示例:
#!/bin/bash
IFS_SAVE="$IFS"
IFS=$'\x0a'
for f in $(find dir1 -type f -printf "%f\n"); do {
f1="dir1/$f"
f2="dir2/$f"
cmp --quiet "$f1" "$f2"
check=$?
if [ $check -eq 0 ] ; then
echo -e "OK: $f"
elif [ $check -eq 1 ] ; then
echo -en "Mismatch FOUND in files: "
filesize1=$(stat --printf="%s" "$f1" )
filesize2=$(stat --printf="%s" "$f2" )
echo "$f1" size:"$filesize1" "$f2" size:"$filesize2" check:"$check"
#you may put diff ... or anything else here
else
echo "cannot compare files, probably $f2 is missing"
fi
} ; done
IFS="$IFS_SAVE"
根据您的情况(如果文件名不包含空格,没有丢失的文件等),您可能会省略一些部分-这是从较大的脚本中剪裁而来的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.