試圖循環每個文件,做一些切割,提取MD5的前4個字符。Linux管道尋找和md5sum不發送輸出
這是我走到這一步:
find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. | md5sum | head -c 4
問題是,我沒有看到任何更多的輸出,在這一點上。我如何發送輸出到md5sum
並繼續發送結果?
試圖循環每個文件,做一些切割,提取MD5的前4個字符。Linux管道尋找和md5sum不發送輸出
這是我走到這一步:
find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. | md5sum | head -c 4
問題是,我沒有看到任何更多的輸出,在這一點上。我如何發送輸出到md5sum
並繼續發送結果?
的md5sum讀一切從標準輸入,直到文件(EOF)的結束,並輸出完整的文件的MD5校驗。你應該while read var
迴路分開輸入到行,每行運行的md5sum,例如:
find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. |
while read -r a;
do echo -n $a| md5sum | head -c 4;
done
read
builtin bash command將讀取從輸入的一個線到Shell變量$a
; while
循環將爲每次讀取返回運行循環體(do
和done
之間的命令),$ a將爲當前行。閱讀的-r選項是不轉換反斜槓; echo命令的-n選項不會添加換行符(如果您想換行,請刪除回顯的-n選項)。
這對於數以千計的文件和更多文件來說會很慢,因爲循環內的每個文件都有幾個forks/execs。使用內建md5散列計算(或某些庫)的腳本語言更快,可以使用perl或python或nodejs或任何其他腳本語言編寫腳本。
在https://stackoverflow.com/a/5890196中使用了相同的循環,類似於https://stackoverflow.com/a/31955350 – osgx
這是我正在尋找的,但無法弄清楚 – user2914191
如何找到那麼所有.jpg文件,然後執行的md5sum削減前4個caracters:
find . -name '*.jpg' -exec md5sum {} \; | cut -b 1-4
我需要md5的文件名(沒有擴展名),而不是文件的整個路徑 – user2914191
儘管這段代碼可能回答這個問題,但提供了關於如何和/或爲什麼它解決了這個問題的附加上下文提高答案的長期價值。 – Badacadabra
您可以使用您從find
撥打的簡短「幫手」腳本來做你正在嘗試做的事情。例如,您可以創建一個簡短腳本來查找作爲參數傳遞的每個文件的basename
,刪除'.jpg'
擴展名,然後提供其餘名稱不帶擴展名作爲md5sum
的輸入以stdin
以獲得名稱本身的md5sum
。請致電劇本,如namemd5.sh
。例如:
#!/bin/bash
[ -z "$1" ] && exit 1 ## validate single argument
fname=$(basename "$1") ## get the filename alone
fname="${fname%.jpg}" ## remove .jpg extension
fnsum=$(md5sum - <<<"$fname") ## get md5sum of name w/o .jpg
fnsum=${fnsum%% *} ## remove trailing ' -'
echo "$fnsum - $fname" ## output md5sum - name
## (remove ' - $fname' for md5sum alone)
(注:名字作爲輸出例如目的的一部分提供,如果您想單獨md5sum
如上面的註釋刪除)
示例文件
$ find /home/david/img/wp/ -type f -name "*.jpg"
/home/david/img/wp/hacker_manifesto_1200x900.jpg
/home/david/img/wp/hacker_manifesto_by_otalicus.jpg
/home/david/img/wp/reflections-triple-1920x1200.jpg
/home/david/img/wp/hacker_wallpaper_1600x900.jpg
/home/david/img/wp/Zen.jpg
/home/david/img/wp/hacker_wallpaper_by_vanilla23-dot254.jpg
/home/david/img/wp/hacker_manifesto_1600x900.jpg
實施例使用/輸出
$ find /home/david/img/wp/ -type f -name "*.jpg" -exec ./namemd5.sh '{}' \;
0f7d2aac158eb9f7842215e14ff6573c - hacker_manifesto_1200x900
604bc695a0bb70b8db0352267caf226f - hacker_manifesto_by_otalicus
5decea0e306f185bf988ac9934ec0e2c - reflections-triple-1920x1200
82bd8e1ad3df588eb0e0848c5f764812 - hacker_wallpaper_1600x900
0f4daba431a22c03f28977f087e4c695 - Zen
0c55cd3ebd2a847e10c20d86e80e6ceb - hacker_wallpaper_by_vanilla23-dot254
e5c1da0c2db3827d2bf81c306633cc56 - hacker_manifesto_1600x900
您也可以在find
之內調用-execdir
版本的腳本,例如,
$ find /home/david/img/wp/ -type f -name "*.jpg" -execdir \
/full/path/to/namemd5.sh '{}' \;
(注:使用/full/path
的上面你的助手腳本)
你們是不是要計算文件的MD5SUMS?這不是在這裏發生的。 –
不,我想計算從管道輸出的文本的md5 – user2914191
'find'命令是否完成? –