Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 递归检查shell中文件之间的差异_Linux_Bash_Shell - Fatal编程技术网

Linux 递归检查shell中文件之间的差异

Linux 递归检查shell中文件之间的差异,linux,bash,shell,Linux,Bash,Shell,我试图递归地检查shell中两个独立目录中的文件之间的差异。注意:-两个目录相同,但根目录名称不同 在上图中,我希望在脚本文件中递归地为根目录中的所有文件“diff ROOT_A/A.md5 ROOT_B/A.md5” for filename in ROOT_A/*.md5; do diff ($filename | cut -d '/' -f 2) (ROOT_B/$filename) >> logfile.txt done 然而,这不起作用。有人能帮我解决这个问题吗

我试图递归地检查shell中两个独立目录中的文件之间的差异。注意:-两个目录相同,但根目录名称不同

在上图中,我希望在脚本文件中递归地为根目录中的所有文件“diff ROOT_A/A.md5 ROOT_B/A.md5”

for filename in ROOT_A/*.md5; do
    diff ($filename | cut -d '/' -f 2) (ROOT_B/$filename) >> logfile.txt done

然而,这不起作用。有人能帮我解决这个问题吗。谢谢

假设您的shell是Bash:

ROOT_A='…'
根_B='…'
对于“$ROOT\u A”/*.md5”中的文件;做
! 测试-r“$file”| |!测试-r“$ROOT_B/${file##*/}”&继续(&C)
echo“将$file与$ROOT_B/${file##*/}进行比较”
diff“$file”“$ROOT_B/${file##*/}”
完成

正如@CharlesDuffy所观察到的,如果文件是真正的MD5和(或其他类似的校验和),
diff
应该替换为
cmp
,因为只有当文件相同或不同时,文件之间的差异才无关紧要。

您尝试的命令在哪里?我们不能在没有代码的情况下帮助您查看问题的位置…用我的代码片段更新了我的问题。感谢Bash,与其使用
cut
,不如使用内置功能通过删除匹配前缀来修改变量的值--
“${filename###*/}”
将删除最后一个
/
之前的所有内容。你当然想说
diff$(…)
(注意
$
);而且
(ROOT_B/$filename)
并不是你认为它的意思。顺便说一句,在
完成后放置
>logfile.txt
比在循环中放置
>logfile.txt
更有效(因为它只打开一次输出文件,而不是每次要写入单个命令的输出时都重新打开一次),并且(可能是可取的)副作用是在循环开始时只清除一次文件(因此不会混合多个运行的输出)。我建议使用
cmp
而不是
diff
——这是一个较小的工具,可以在回答“这些文件不同吗?”的问题后立即退出,而无需回答“它们有什么不同?”。(尤其是
cmp-q
,这里只检查退出状态——当然,md5校验和不应该是这种情况,但是
cmp-q
可以通过查看
stat
数据来确定文件是否不同,如果它们的大小不同,甚至不打开它们,或者如果它们由相同的数据支持,它们是否相同。)inode)@CharlesDuffy:OP想要区分文件。你是对的——OP要求的东西在md5sums的上下文中显然是错误的,但是,这仍然是他们要求的。嘿@charlesduff,我对脚本编写不熟悉,是的,我正试图使用diff比较这两个目录,并为相同的目录创建一个新的logfile.txt。是吗有更好的方法吗?。提前谢谢。@SagarNair,…取决于您想要的实际输出是什么。如果它是一个只包含相同文件或不同文件的列表,肯定有比使用
diff
更有效的方法。如果您想查看不同的实际行(排列成尽可能小的一组面向行的增量),那么
diff
是正确的工具——只是它所做的额外工作在性能和内存使用方面有成本。