检查文件是否已被修改

时间:2017-06-12 12:49:28

标签: bash

如何验证此替换命令是否成功:

perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts

我试过检查返回值:

if [ $? -eq 0 ]; then
    echo "OK"
else
    echo "Error."
fi

但是当命令失败时,没有设置返回值。

由于

4 个答案:

答案 0 :(得分:1)

我不知道Perl,但是您可以使用一点Bash脚本管理多个“错误”(无法匹配/无法写入文件)的情况:

#!/bin/bash

FILE="/etc/inet/hosts"
SEARCH="contoso"
REPLACE="$hostname"
NB=$(grep -c $SEARCH $FILE)

if [ $NB -ne 0 ]; then
    perl -pi -e 's/${SEARCH}/'${REPLACE}'/g' "$FILE" && echo "${NB} replaced" || echo "Error (permission maybe)"
else
    echo "No match in file"
fi

我认为通过改进Perl代码或使用sed命令有更好的方法。但它应该有效。

答案 1 :(得分:1)

如果您希望perl脚本返回具有某种含义的值,则需要编写perl脚本以返回有意义的值。在你的情况下,也许就像这样简单:

perl -p -e 's/contoso/'"$hostname"'/g; $rv=1 if $&; END{ exit !$rv }'

答案 2 :(得分:1)

一个选项是检查文件是否已被修改。您可以通过将备份文件的扩展名添加到-i选项来实现:

perl -pi.orig -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts

此命令会将/etc/inet/hosts的原始内容存储到/etc/inet/hosts.orig中。然后运行指定的命令。然后,您可以检查文件是否不同,例如cmp命令:

if ! cmp -s foo.txt foo.txt.orig; then
    echo OK
else
    echo ERROR
fi

之后删除.orig文件。

另一个选项是修改脚本以读取文件的内容,替换所需的条目,检查实际发生的更改并在最后返回正确的状态以使用$?在shell中进行验证。您已在this answer中获得解决方案。

答案 3 :(得分:0)

通常,校验和是检测文件更改的一种非常有效的方法。

md5sum [filename]

root@miaoulis:~# echo 'line 1' >>1.txt
root@miaoulis:~# md5sum 1.txt
5c2ce561e1e263695dbd267271b86fb8  1.txt
root@miaoulis:~# echo 'line 2' >>1.txt
root@miaoulis:~# md5sum 1.txt
c7253b64411b3aa485924efce6494bb5  1.txt

我猜这个总和可以用AWK从输出中提取

root@miaoulis:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "MD5:",$1}'
MD5: c7253b64411b3aa485924efce6494bb5

root@miaoulis:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "filename:",$2}'
filename: 1.txt

FS =“*”指示AWK在出现一个或多个空格时拆分字符串。 $ 1将是MD5,$ 2将是文件名。

MD5校验和适用于任何大小的文件。缺点是你没有真正检测到文件中的确切变化,只是它已经改变了。对于大多数情况来说应该足够好了。