繁体   English   中英

在Shell脚本中比较文件,但忽略特定差异

[英]Comparing files, but ignoring specific differences, in a shell script

我有一个Shell脚本,可以在两个目录中比较同名文件,并提醒我有区别。 大多数情况下,新批处理中的文件文件保持不变,但偶尔会有更改,因此我需要采取一些措施。 我试图更新脚本以忽略我不关心的细微差别,特别是Amazon S3 URL中的Expiration和Signature标签。

我当前的脚本使用cmp来精确比较文件:

if ! cmp --silent ${i} ${COMPARE_DIR}/${i}; then
  echo "$i : TAKE ACTION"
fi

我在命令行上很快就得出了一种使用sed正则表达式指出违规模式的方法:

cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)

为了我的一生,我无法弄清楚在脚本中实现此功能的语法。 首先,它抱怨括号,并且在转义那些括号后,我得到了一个非常有用的提示No such file or directory error。 我尝试过的其他方法都无法改善。

有什么建议么? 有没有更好的方法来达到我想要的?

假设行cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)工作正常,您可以检查结果如下:

cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json)
if [ "$?" -ne "0" ] ; then
    echo "$i : TAKE ACTION"
fi

首先,它抱怨括号,并且在转义那些括号后,我得到了一个非常有用的提示。No such file or directory error。

您的脚本很可能以Bash运行。 确保第一行是#!/bin/bash (或系统中有Bash的任何地方)。 这是因为<(...)是特定于Bash的,并且/bin/sh或它所链接的任何内容可能不受支持。

例如,如果脚本的第一行是#!/bin/sh ,那么您将得到如下错误:

script.sh:第3行:意外令牌'('附近的语法错误

然后,就像您说的那样,您像“ <\\(sed -e ...\\) ,转义了括号”,shell会将其解释为来自文件的输入重定向,因为您没有这样的文件(名为“(sed”)的“ No such file or directory错误完全符合预期。

如果您的操作可以写为单个命令或函数调用,则可以使用&&|| 运算符,以替换if-thenelse ,以换取真正凌乱的单行代码:

 cmp <(sed -e "s/Expires.*3D/Expires3D/" file1.json) <(sed -e "s/Expires.*3D/Expires3D/" ../other/file1.json) && echo "$i : TAKE ACTION" || echo "$i: No Action"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM