2012-06-20 144 views
3

您好我正在查看目錄中的文件正在改變,我想要獲取每個文件的md5sum並將其寫入文本文件。然後,我知道一個文件已經改變,我想再次運行它,所以我可以區分輸出文件,看看究竟發生了什麼變化。這是我嘗試過的,但它不起作用,因爲我需要。Bash得到一個文件夾中的所有文件的md5sum

而且不僅我需要讓每一個文件的md5sum文件夾中包含子目錄我需要它不跟隨符號連接

#!/bin/bash 
# 

cd /sys/class 
for i in $(find . -type f) 
do 
    ls -lt "$i" >> /home/george/Desktop/before.txt 
done 
echo "Finished!" 

感謝您的幫助

===編輯===

我把我的實際路徑,因爲我真的不需要隱藏它們。無論如何,運行這個只返回幾個文件(輸出文件在下面),這是文件夾中的文件,這意味着它不會進入子目錄並找到這些文件。順便說一句對不起我的是bash的方式生鏽

--w------- 1 root root 4096 Jun 20 03:03 ./gpio/export 
--w------- 1 root root 4096 Jun 20 03:03 ./gpio/unexport 
-rw-r--r-- 1 root root 4096 Jun 20 03:03 ./firmware/timeout 
-r--r--r-- 1 root root 4096 Jun 20 03:04 ./drm/version 

=== EDIT2 ===

也不清楚爲什麼某些文件不被發現,例如 /SYS /班/背光/ intel_backlight /亮度

和很多人一樣,但是也有一些不被人發現由於某些原因

+0

只要將-type d改爲-type f?我不認爲默認情況下符號鏈接,所以你會沒事的。你的for循環將不會使用文件名中的空格,你最好使用另一種方法 - 在這裏討論http://stackoverflow.com/questions/7039130/bash-iterate-over-list-of-files-with-空格 – Adam

+0

我想檢查最新修改日期不是一個選項,對吧?這將是更快,更簡單,但當然,幾乎不像安全 – Miquel

+0

我會嘗試f感謝亞當和米克爾,我想這可以工作太多,至少我認爲這是有道理的,我知道MD5是緩慢的,有很多文件 – user577732

回答

13

cd是不必要的,並與type -f你已經在事實上繞過的符號鏈接。因此,循環是不必要的,太:

如果您find太老支持-exec {} +嘗試-exec {} \;代替。

對於md5sum比較,您可以嘗試簡單地刪除相同的行;

fgrep -vxf before.txt after.txt | less 

這假設在before.txt列表將適合fgrep;但如果你正在處理幾十萬個文件,它可能會應付。雖然這不會識別before.txt中的已刪除文件。

+0

同樣的事情我的編輯仍然只輸出4件事情由於某種原因,但像解決方案非常乾淨到目前爲止只是沒有給我所有的一切由於某種原因 – user577732

+0

甚至沒有sudo之前,使命令看起來像sudo查找/ sys /類型f -exec ls -lt {} +> .txt – user577732

+0

它不會進入子目錄這是我這也是我剛纔意識到的 – user577732

0

如果你的文件列表尺寸足夠小,你可以做到這一切在內存中的文件太多了,喲你可能會考慮使用哈希來排序.txt。如果您對after.txt執行相同的操作,即使文件名已更改,您也可以逐行對每個文件進行識別並確定匹配項。如果使用文件修改日期是一個選項,您可以使用ls -lt | head來篩選出最新的文件並保持這一點。然後,當您想要再次檢查更改時,ls -lt並通過比您存儲日期更新的任何內容。這應該很好地工作,無論文件列表的大小,但會很容易受到別人修改的最後修改日期(這需要root權限)

+0

以及文件列表肯定相當長,這就是爲什麼我肯定認爲md5不是最好的方式去,但內存可能不是一個好方法去,因爲列表很長 – user577732

+0

好吧,我已經修改我的解決方案,以澄清修改日期,以防你可以使用 – Miquel

+0

以及這個想法是這樣的,我的筆記本電腦有一個背光鍵盤,它的軟件是Windows我然而運行Linux。當我啓動鍵盤時,鍵盤會亮起,但是要進入睡眠狀態,然後喚醒它,鍵盤保持關閉狀態。所以我期待看到/ sys/class中有什麼變化(我首先看的地方)我假設一些文件正在改變,告訴LED關閉 – user577732

相關問題