2012-06-20 98 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

相关问题