2017-01-24 11 views
3

Идея состоит в том, чтобы определить, имеет ли два заданных файла то же самое содержимое, но независимо от различий между случаями.Как проверить случай схожести файла в чутко

например. Если file1 был alpha, а file2 - AlphA, тогда Script file1 file2 дает «То же».

Как сделать скриптовый код чувствительным?

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

ответ

4

cmp использует байт в байт сравнения, так что вам придется сделать свой собственный случай преобразования первого:

if cmp -s <(tr '[:upper:]' '[:lower:]' <"$1") <(tr '[:upper:]' '[:lower:]' <"$2"); then 
    echo "Mostly the same." 
else 
    echo "Different." 
fi 
  • -s марки cmp silent - то есть, если есть различия, они не печатаются.

  • - process substitution, что, как показано на рисунке, выводит команду как временный, эффективно самоисключающий файл; поскольку в технологических подстановках используются трубы, их использование эффективно с точки зрения памяти и работает даже с с большими выходными наборами.

  • tr '[:upper:]' '[:lower:]' выполняет преобразование символов, предоставляемое через stdin, в верхнем регистре и в нижнем регистре, что приводит к выдаче всего нижнего регистра.

  • Также обратите внимание, как $1 и $2 являются двойными кавычками, чтобы гарантировать, что их значения используются как есть (двойные кавычки защищают значение от shell expansions).

1

Возможно:

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

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

Это работает (оставляя отсутствие двойных кавычек и бесполезное использование 'cat' в стороне), но чтение целых файлов в память лучше избегать, если больше памятей эффективных решений доступны. – mklement0

1

Если файлы достаточно малы, вы можете сделать это проще.

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

++, но стоит отметить, что расширение '^^' параметра (которое преобразует всю переменную в верхний регистр) требует Bash v4 + (не будет работать на macOS). – mklement0