LINUX.ORG.RU

md5sum всех файлов каталога за исключением некоторых конкретных.

 


0

1

Приветствую! Как правильно описать шаблон по выборке файлов за исключением парочки конкретных имен? Задача: получить контрольную сумму всех файлов в каталоге но при этом не принимать во внимание контрольную сумму одного или двух конкретных файлов в каталоге. Смысл в том что бы проверить все ли файлы в неизменном виде и не появилось ли рядом лишних. А эта парочка исключаемых может по содержимому зависеть от той общей md5sum потому я не могу их включить в запрос потому как рекурсия какая то получится. Запрос по простому мог бы выглядеть примерно так:

cat * | md5sum
Вот нужно из «звёздочки» исключить например файл «one» и файл «two.txt» Возможно всё просто, но сложно задать вопрос поисковику где о такой простоте почитать :)


$ ls test* file*
file   file10  file3  file5  file7  file9  test10  test3  test5  test7  test9
file1  file2   file4  file6  file8  test1  test2   test4  test6  test8

$ find . ! -name one -a ! -name two.txt -exec md5sum {} \; 
d41d8cd98f00b204e9800998ecf8427e  ./test10
d41d8cd98f00b204e9800998ecf8427e  ./test9
...................
d41d8cd98f00b204e9800998ecf8427e  ./file4
d41d8cd98f00b204e9800998ecf8427e  ./file1
imb ★★
()

man bash в районе extglob (+ саму опцию придется включить), если posix shell - то можно ls | grep -v "..." | xargs cat | md5sum

anonymous
()
Ответ на: комментарий от DeVliegendeHollander

я бы сказал, score enlargement)

anonymous
()
Ответ на: комментарий от anonymous

Уболтал. Судя по cat * | md5sum ТС страдает фигней и толком не понимает, как решить задачу.

// создание файла контрольных сумм
md5sum * > md5.sum
// проверка
md5sum -c md5.sum
// cheat code: man md5sum
x_hash
()
Ответ на: комментарий от x_hash
// создание файла контрольных сумм
 md5sum * | sort -u > md5.sum
// изменения на fs
touch test.txt
// проверка
md5sum * | sort -u > /tmp/md5.sum
diff md5.sum /tmp/md5.sum
// в $? лежит ответ на вопрос diff или не diff
// дальше нужно обновить md5.sum
x_hash
()
Ответ на: комментарий от x_hash

Ну, еще до кучи, полезно создавать временные файлы через mktemp. Т.е.

TMP_FILE=`mktemp`
md5sum * | sort -u > $TMP_FILE
diff
rm $TMP_FILE # или mv $TMP_FILE md5.sum

x_hash
()

ышшо вариант :

$ sort > ignore.txt
one
two.txt
ignore.txt
^D
$ ls | comm -1 -3 ignore.txt - | xargs md5sum

MKuznetsov ★★★★★
()

Мне тут вот подумалось, а

cat * | md5sum
«cat *» всегда в одном и том же порядке файлы будет брать? Например, от настроек локали как это будет зависеть...

x_hash
()

извратный вариант :

chmod -r one two.txt
md5sum *

и так далее

for name in * ; do case $name in "one" | "two.txt") ;;  *) md5sum "$name";; esac ; done

echo * | sed -r '/^(a.out|two.txt)$/d;s/(.*)/md5sum \\"\1/\\"' | sh -

продолжаем стрелять в ногу

find -type f -regextype posix-extended -not -regex '~\./(one|two\.txt)' -exec md5sum "{}" \;

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)

проверить все ли файлы в неизменном виде и не появилось ли рядом лишних

если это чисто техническая проверка (враги не подделывают даты), и ненадо отслеживать удаления, то можно делать совсем просто «touch marker; chmod -rw marker» и через какое-то время проверяем «find . -newer marker»

если каталог реально критичен,файлов много и ситуация частая, то лучше взять готовое решение, чем настрогать велосипед у которого вместо колёс, педалей и руля - грабли разных фасонов :) Из готового есть tripwire (по функционалу попроще - фактически счётчик контрольных сумм) и AIDE (посложнее,побыстрее, поглючнее)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ух какой резонанс вызвал вопрос :)

Действо происходит на арм девайсе потому шелл ограничен

# echo $SHELL
/bin/sh
На busybox что ли все завязано в общем. Пока из предложенного не выбрал особо ничего. Возможно с chmod и выйдет что. До того встречал тоже варианты с грепами и файндом. Например
find  * -print0
так можно отсеить лишних, но как применить для md5 пока не понятно.
grep -v file1
не помогает.

Оно то можно всё описать программой и без шелловой команды обойтись, но полагал что такой простой вариант получения md5sum всех за исключением некоторых существует, видимо не так просто таки :)

DJArty
() автор топика
Ответ на: комментарий от x_hash

Воот а вот это уже подходит :)

только вот так я хотел:

ls -1 | grep -v one | grep -v two.txt | while read f; do cat "$f"; done | md5sum
Т.е. получить контрольную сумму всех файлов (за исключением двух) одним значением.

Спасибо!

DJArty
() автор топика
Ответ на: комментарий от DJArty

Еще бы избавиться от " - " в конце вывода md5sum вообще бы красота была..

DJArty
() автор топика
Ответ на: комментарий от DJArty

поосторожнее там в ембедщине с регулярмаки и греп`ом :)

$ cat | grep -v one | grep -v two.txt
patrone
two-txt
onelephant
clonetwo+txt   
Опаньки :)
^D
Опаньки :)
$
я так понимаю, что вы ожидали другой результат

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Так у меня ж не cat грепается а ls

С катом греп не проходит я потому сначала и сказал что не годится, а вот фильтрануть лс, потом прокатить - так нормально )

DJArty
() автор топика
Ответ на: комментарий от DJArty

Так у меня ж не cat грепается а ls

вы видите разницу со стороны grep`а ?

«grep -v one» - отсеит все строки (имена файлов полученные от ls) которые содержат «one», так можно пройтись по грабелькам; в вашем случае получить файл-нежданчик не попадающий в контрольные суммы

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Ну не знаю.. ужесточить греп на точное соответствие имени..

Можно ж грепу задать мол если one один в один то отбрасываем, если one22 или noone то пропускать?

Пока то это самый подходящий вариант.

DJArty
() автор топика
Ответ на: комментарий от DJArty

Эх.. да только grep ущербный оказался - не поддерживает ключ -w Ну да это частный случай значит исключаемые должны быть исключительно уникально названы :о)

DJArty
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.