LINUX.ORG.RU

md5 для каждого файла из find в файл рядом

 , ,


1

1

Доброго всем времени. Помогите пожалуйста, нужно подсчитать md5 для каждого файла в директориях, соответствующего условию (размер, возм. - дата), и поместить ее рядом с исходным файлом в файл с именем «имя_файла.md5». Пытался делать так, но не работает:

find /dir/dir -type f -size 1M -exec md5sum {} > "{}.md5" \;

for f in $(find /dir/dir -type f -size 1M); do md5sum $f > $f.md5; done

нет никакой нужды делать это в одну команду, если это сложно. ведь главное чтоб работало, угу? я уверен что найдутся и те, кто пофиксят ваш вариант и предложат более лучший.

а для т.н. «байтодрочерства» есть более подходящие языки (C).

Spoofing ★★★★★
()
Последнее исправление: Spoofing (всего исправлений: 1)
Ответ на: комментарий от Spoofing

Такой командой, ты положишь хеши не рядом с найденным файлом, а в директории, в которой происходит выполнение команды.

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

ОЙ ВСЁ

for f in $(find /dir/dir -type f -size 1M); do cd $(dirname $f); echo $(md5sum $f) > $f.md5; done

Spoofing ★★★★★
()
Ответ на: комментарий от shell-script

честно, я мозг даже не включаю, вот даже сейчас ._. так что извиняйте.

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

Твой вариант слегка сломается на файлах с пробелами.

onhydro
()
#!/usr/bin/env bash

find dir1/dir2/ -type f -exec md5sum '{}' \; | while read line; do
    hashsum="$(echo "$line" | awk '{print $1}')"
    filename="$(echo "$line" | awk '{print $2}' | xargs basename)"
    echo "$hashsum" > "$filename".md5
done


Что-то вроде того. Но нужно потестить.

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

Как-то так:

А зачем bash? Лишнее. Достаточно sh.

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

С пробелами не обрабатывает правильно. Нужно

#!/usr/bin/env bash

find testdir/ -type f -exec md5sum '{}' \; | while read line; do
    hashsum="$(echo "$line" | awk '{print $1}')"
    filename="$(echo "$line" | awk '{$1=""; printf"%s",$0}' | xargs -0 basename)"
    echo "$hashsum" > hashes/"$filename".md5
done

Yorween
()

А теперь правильный ответ:

Перенаправление с помощью > умеет делать оболочка (напр bash). А find не оболочка и её трюки делать не умеет, поэтому код топикстартера и не работал. Вот такой вариант будет работать с файлами с любыми символами в именах:

find /dir/dir -type f -size +1M -exec sh -c 'md5sum "$0" > "{}.md5"' {} \;

PS не забываем + у -size.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

ну наконец-то, я уже думал тут одни шизофреники остались

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

правильный ответ

find не оболочка и её трюки делать не умеет, поэтому код топикстартера и не работал

А может всё таки > "{}.md5" до find даже не доходил?

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

Ты опечатался, когда задачу читал. «А теперь правильный ответ». ЛОл. Глаза прочисть а потом свои портянки выставляй.

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

sh -c 'md5sum «$0» > «$0.md5»'

подсчитать md5 для каждого файла... и поместить ее рядом с исходным файлом в файл с именем «имя_файла.md5»

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

Конечно, не доходил. Если бы доходил, то find бы его передавал в команду как обычный аргумент.

Я, кстати, даже не знал, что перенаправление может быть в середине команды, откуда sh его выкусывает:

# sleep > derp 456 & ps -f | grep sleep
[1] 13032
legolegs 13032 12978  0 19:46 pts/0    00:00:00 sleep 456
legolegs 13034 12978  0 19:46 pts/0    00:00:00 grep sleep
legolegs ★★★★★
()
Ответ на: комментарий от legolegs

[code]find /dir/dir -type f -size +1M -exec sh -c 'md5sum «$0» > «$0.md5»' {} \; [/code]

legolegs, большое спасибо, работает

всем откликнувшимся так же спасибо

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