[英]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-then
和else
,以换取真正凌乱的单行代码:
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.