Сравнение файлов и их свойств

Каждый день я получаю информацию о определенном наборе файлов в моей почте, которая выглядит так:

58623208 Sep 14 20:08 blbn_blfbe_drv 57904920 Sep 14 19:54 blbn_cycmn 55814208 Sep 14 06:02 clsa_Upd 38912000 Sep 14 19:12 cs_chgpp 41107456 Sep 14 19:17 csmRFbe 39403520 Sep 14 19:09 csmUAddAct 39235584 Sep 14 19:20 csmUAddSub 

… и так далее, около 60 файлов.

Теперь мне нужно сравнить все эти файлы один за другим с существующими файлами, чтобы убедиться, что все файлы найдены соответствующими.

filename , timestamp , date и size – это должно быть совпадение.

Есть ли способ автоматизировать его?

Я думал об использовании comm или diff .

2 Solutions collect form web for “Сравнение файлов и их свойств”

Я предполагаю, что у вас есть дата GNU, с опцией -d :

 while read size mon day time filename; do if [[ ! -f "$filename" ]]; then echo "ERROR: no such file: $filename" >&2 else filesize=$(stat -c %s "$filename") if [[ "$size" != "$filesize" ]]; then echo "ERROR: size mismatch: $filename" >&2 else filetime=$(date -d "$(stat -c %y "$filename")" "+%b %d %H:%M") if [[ "$mon $day $time" != "$filetime" ]]; then echo "ERROR: date mismatch: $filename" >&2 fi fi fi done 

Предполагая, что все новые файлы находятся в (или могут быть перемещены) новыми /, а все старые файлы находятся в старых / каталогах, вы можете использовать «diff -ur old / new /», чтобы увидеть различия между файлами между каталогами.

Если вы не заботитесь о природе различий, только тот факт, что некоторые файлы отличаются друг от друга, используйте grep для фильтрации вывода, но вы потеряете код выхода из diff (1 = найденные различия). Вместо этого вы можете использовать код выхода из grep (1 = не найдено совпадений regexp, которые вы можете интерпретировать как означающие, что все файлы одинаковы).

например, я сгенерировал некоторые текстовые файлы в старых и новых (просто мусор, содержащий списки каталогов / bin, / sbin и / etc). затем я отредактировал новый / baz и удалил несколько строк:

 $ ls -l new old new: total 28 -rw-r--r-- 1 cas cas 11063 Sep 15 15:27 baz -rw-r--r-- 1 cas cas 14529 Sep 15 15:25 foo old: total 20 -rw-r--r-- 1 cas cas 6843 Sep 15 15:24 bar -rw-r--r-- 1 cas cas 12025 Sep 15 15:24 baz 

во-первых, сравните два каталога:

 $ diff -ur old new | egrep '^(Only|diff)' Only in old: bar diff -ur old/baz new/baz Only in new: foo $ echo $? 0 

здесь вы можете увидеть код выхода, когда src и dst dir одинаковы (или имеют точно такой же контент)

 $ diff -ur old old | egrep '^(Only|diff)' $ echo $? 1 

вы также можете использовать cmp, но он может соответствовать только отдельным файлам, он не может рекурсивно проверять два каталога для различий. вам нужно будет написать обертку для цикла цикла, и вам придется принимать во внимание файлы, которые существуют только в новом, но не в старом. более простой в использовании diff.

  • Включение подпараметров в варианты справки для правильного выполнения без getopt или getopts?
  • Как использовать multiline как group-separator в grep?
  • Использование сгенерированного списка имен файлов в виде списка аргументов - с пробелами
  • Написание сценария завершения вкладки для bash
  • Почему {} не работает для этой команды?
  • case + как реализовать равный или меньше или больше в случае синтаксиса
  • Я попадаю в состояние гонки в bash?
  • Что такое альтернатива initlog (присутствует в RHEL5), но не рекомендуется в RHEL6?
  • Изменить регистр n-й буквы в строке
  • Как я могу запустить программу из bash, игнорируя ее stdout, чтобы я мог запускать больше программ?
  • Использование AWK для преобразования чисел в 0 или 1
  • Правильное расположение трубопроводов и перенаправление вывода в find -exec?
  • Linux и Unix - лучшая ОС в мире.