Bash получить md5sum файла, а не путь как строку

Я пытаюсь сохранить md5sum нескольких java-файлов в текстовом файле, но, как я вижу, он создает md5sum пути, а не сам файл.

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        echo -n $line | md5sum.exe | cut -d' ' -f1 | tr -d '\n' >> $FileName
        echo -n "-" >> $FileName
        echo -n $line | cut -d' ' -f2 >> $FileName
    fi
done

Я также пытаюсь устранить любую новую строку, кроме последней. Когда я изменил путь для md5sum на несуществующий файл, он все равно создал md5sum. (Я использую MINGW Shell)


person Cupple Kay    schedule 04.09.2014    source источник
comment
Почему у вас есть суффикс .exe? Вы на Cygwin?   -  person tripleee    schedule 04.09.2014
comment
@MarkSetchell Я пробую это прямо сейчас, но мне придется провести тест примерно на 30 минут, пока я не буду уверен, что он правильный. Заранее спасибо.   -  person Cupple Kay    schedule 04.09.2014
comment
Возможно, вы сможете заменить весь скрипт на md5sum.exe *.java — в зависимости от реализации md5sum.exe.   -  person Mark Setchell    schedule 04.09.2014


Ответы (2)


Если вас просто беспокоит вывод суммы md5 и имени файла в файл в формате md5sum-filename, вы можете просто использовать расширение шаблона и извлечение подстроки для чтения суммы md5 файла. (где бы он ни находился) и удалите информацию о пути, оставив только имя для вывода:

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        md5str="$(md5sum "$line")"
        sum=${md5str%% *}
        sumfn=${md5str##* }
        sumfn=${sumfn##*/}

        echo "$sum-$sumfn" >> $FileName
    fi
done
person David C. Rankin    schedule 04.09.2014
comment
Ну, это кажется довольно идеальным. Я проверю это некоторое время и вернусь к вам, но пока я, кажется, доволен этим ответом, спасибо. - person Cupple Kay; 04.09.2014
comment
Еще раз спасибо, я провел довольно большой тест, и все было идеально. Отличная работа! - person Cupple Kay; 04.09.2014

Действительно, md5sum без имени файла считывает свои данные (а не аргументы) из стандартного ввода и вычисляет для этого контрольную сумму.

Кстати, echo filename | xargs md5sum — это обходной путь, если вам действительно нужно читать аргументы со стандартного ввода.

Но здесь у вас нет причин хотеть этого.

find "$FilesDirectory" -type f -iregex '.*\.java' \
    -exec md5sum + |
sed 's%  *.*/%-%' >"$FileName"

-type f заменяет if [ -f ..., а -exec ... + запускает md5sum для всех найденных файлов. Затем мы просто постобрабатываем вывод, чтобы поставить тире вместо пробелов после контрольной суммы. Регулярное выражение соответствует пробелам, затем любому символу до последней косой черты и заменяет их все. Таким образом, он также удаляет имя пути.

(Если у вас старая версия find, возможно, вам придется использовать вместо нее -exec md5sum {} \;.)

Если все файлы находятся в текущем каталоге, и нет каталогов, соответствующих подстановочному знаку (в этом случае -type f также является лишним выше), и их не так много, чтобы заставить подстановочный знак расширяться до слишком длинного steing ("Список аргументов слишком длинный"), вы можете просто сделать

md5sum *.[jJ][aA][vV][aA] | ...

Если вам нужно использовать find и у вас есть подкаталоги, но вы не хотите, чтобы они проходили через них, добавьте -maxdepth 1.

person tripleee    schedule 04.09.2014
comment
Ну, я попробовал это, но он говорит: найти: отсутствует аргумент для `-exec' После того, как я искал exec в Интернете, я нашел только способы перенаправить стандартный ввод в файл, используя имя файла в качестве аргумента. Но я не вижу, как его использовать в этом случае. - person Cupple Kay; 04.09.2014
comment
Это указывает на то, что -exec ... + не поддерживается вашим find. Вместо этого попробуйте вариант -exec ... {} \;. - person tripleee; 04.09.2014