sha1sum файлов в каталоге

У меня есть сценарий, который возвращает sha1sum каждого файла в каталоге наряду с полным путем файла.

for i in /path/to/directory*.*; do sha1sum $i >> checksums.txt; done

Возвраты:

sha1sum  /path/to/directory/filename
sha1sum  /path/to/directory/filename2
sha1sum  /path/to/directory/filename3

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

Я изображаю использование sha1sum $i | awk '{print $1}' путь состоит в том, чтобы пойти, но я не знаю, как получить только имя файла

4
задан 3 January 2017 в 02:19

2 ответа

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

(cd /path/to/directory ; for i in *.*; do sha1sum "$i" ; done) >> checksums.txt

Примечание, что *.* только файлы соответствий с 'точечным расширением' - к контрольной сумме весь файлы, просто используйте *

<час>

, Если бы Вы принимаете решение пойти эти awk маршрут, затем один подход был бы к sub stitute самая длинная подстрока до / из второго поля:

for i in /path/to/directory/*.*; do sha1sum $i ; done | awk '{sub(/.*\//,"",$2)} 1' >> checksums.txt
4
ответ дан 1 December 2019 в 09:21

Просто используйте find команда с -exec флаг как так:

$ find ./TESTDIR -type f -printf "%f\t" -exec bash -c 'sha256sum "$@" | awk "{print \$1}"' sh "{}" \; 
out.txt cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325
2.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
with space.txt  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
script.pl   e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
3.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
steam_locomotive    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
storm carl  e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
1.txt   f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2
sal e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
simple_curl e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

способ, которым это работает, состоит в том, что мы просто печатаем базовое имя сначала с -printf "%f\t" флаг и выполняем оболочку в -exec флаг с передачей фактического пути к файлу как параметр командной строки к самой оболочке.

, В то время как это выглядит немного сложным, это работает над произвольным путем, переданным find команда, таким образом никакая потребность к cd вокруг файловой системы

, Лучшее форматирование может быть достигнуто с изменением команды выше, которая инвертирует положение -printf и -exec флаги:

$ find ./TESTDIR -type f -exec bash -c "sha256sum '{}' | awk '{printf  \"%s\t\",\$1}' " \; -printf "%f\n"
cc29e205d04a4062d0fb131700e8bfc8e54c44d0176a8dca22f40b24ef26d325    out.txt
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    2.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    with space.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    script.pl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    3.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    steam_locomotive
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    storm carl
f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2    1.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    sal
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855    simple_curl
2
ответ дан 1 December 2019 в 09:21

Другие вопросы по тегам:

Похожие вопросы: