如何敏感地检查文件相似性案例

时间:2017-01-24 22:20:18

标签: bash shell file unix case-insensitive

这个想法是告诉两个给定的文件是否具有完全相同的内容,但不管是否存在差异。

e.g。如果file1是alpha而file2是AlphA,那么脚本file1 file2会给出相同的'。

如何使脚本案例不敏感?

#!/bin/bash
if cmp $1 $2 >/dev/null  ; then
   echo "Mostly the same."
else
   echo "Different."
fi

3 个答案:

答案 0 :(得分:4)

cmp使用逐字节比较,因此您必须先进行自己的大小写转换:

if cmp -s <(tr '[:upper:]' '[:lower:]' <"$1") <(tr '[:upper:]' '[:lower:]' <"$2"); then
  echo "Mostly the same."
else
  echo "Different."
fi
  • -s使cmp无声 - 即如果存在差异,则不会打印出来。

  • <(...)process substitution,从宽松的角度讲,它使命令的输出显示为临时的,有效的自我删除文件;由于流程替换使用管道,因此使用它们可以节省内存并且工作均匀 具有大输出集。

  • tr '[:upper:]' '[:lower:]'执行通过stdin提供的字符从大写到小写的区域设置感知转换,从而产生全小写输出。

  • 另请注意$1$2如何双引号以确保其值使用 as-is (double -quoting保护值不受shell expansions)。

答案 1 :(得分:1)

也许:

file1=$(cat $1 | tr '[:upper:]' '[:lower:]')
file2=$(cat $2 | tr '[:upper:]' '[:lower:]')

if [ "$file1" = "$file2" ]; then
    echo "same"
else
    echo "different"
fi

答案 2 :(得分:1)

如果文件足够小,您可以更简单地完成。

#!/bin/bash
f1="$(<"$1")"
f2="$(<"$2")"
if
  [[ "${f1^^}" = "${f2^^}" ]]
then
  echo "Mostly the same."
else
 echo "Different."
fi