我想知道自上次启动shell脚本以来文件是否已被修改,可能是通过创建布尔值或其他东西... 也许可以保存脚本在文本文件中运行的最后一次,并且下次启动脚本时应该读取此文件,然后它应该找出已更改的文件,以便我可以检查是否有文件已更改使用类似:
for file in *
do
#Somecode here
if [ $filehaschanged != "0" ]; then
echo "Foobar" > file.txt
fi
#Somecode here
done
也许可以用find
......任何想法来做到这一点吗?
答案 0 :(得分:19)
迈克尔,通过“更改”,您是在询问文件是否被触摸(即日期戳更新),或者您是否询问内容是否不同?
如果是前者,您可以使用find
或test
对此进行测试。例如,在shell中:
#!/bin/sh
touch file1
sleep 1
touch file2
if [ "file1" -nt "file2" ]; then
echo "This will never be seen."
else
echo "Sure enough, file1 is older."
fi
如果您要查找的内容是对内容的测试,那么您的操作系统可能会包含测试文件哈希值的内容。
[ghoti@pc ~]$ date > testfile
[ghoti@pc ~]$ md5 testfile
MD5 (testfile) = 1b2faf8be02641f37e6d87b15444417d
[ghoti@pc ~]$ cksum testfile
3778116869 29 testfile
[ghoti@pc ~]$ sha1 testfile
SHA1 (testfile) = 5f4076a3828bc23a050be4867549996180c2a09a
[ghoti@pc ~]$ sha256 testfile
SHA256 (testfile) = f083afc28880319bc31417c08344d6160356d0f449f572e78b343772dcaa72aa
[ghoti@pc ~]$
我在FreeBSD。如果你在Linux中,那么你可能有“md5sum”而不是“md5”。
要将其放入脚本中,您需要遍历文件列表,存储其哈希值,然后使用一种机制来针对其存储的哈希值测试当前文件。这很容易编写脚本:
[ghoti@pc ~]$ find /bin -type f -exec md5 {} \; > /tmp/md5list
[ghoti@pc ~]$ head -5 /tmp/md5list
MD5 (/bin/uuidgen) = 5aa7621056ee5e7f1fe26d8abb750e7a
MD5 (/bin/pax) = 7baf4514814f79c1ff6e5195daadc1fe
MD5 (/bin/cat) = f1401b32ed46802735769ec99963a322
MD5 (/bin/echo) = 5a06125f527c7896806fc3e1f6f9f334
MD5 (/bin/rcp) = 84d96f7e196c10692d5598a06968b0a5
你可以在可预测的位置存储这个(而不是/ bin运行它对任何重要的,可能是/
),然后编写一个快速脚本来检查文件中的哈希:
#!/bin/sh
sumfile=/tmp/md5list
if [ -z "$1" -o ! -f "$1" ]; then
echo "I need a file."
exit 1
elif ! grep -q "($1)" $sumfile; then
echo "ERROR: Unknown file: $1."
exit 1
fi
newsum="`md5 $1`"
if grep -q "$newsum" $sumfile; then
echo "$1 matches"
else
echo "$1 IS MODIFIED"
fi
这种脚本就像tripwire这样的工具提供。
答案 1 :(得分:1)
运行脚本时,您可以 touch
所有文件。然后 touch
脚本本身
下次,您只需 find
任何比您的脚本更新的文件。
答案 2 :(得分:0)
kev在Python中的解决方案,如果您有权触摸脚本,则有效:
#!/usr/bin/python
import os
import sys
files= ('a.txt', 'b.txt')
me= sys.argv[0]
mytime= os.path.getmtime(me)
for f in files:
ft= os.path.getmtime(f)
if ft > mytime:
print f, "changed"
os.utime(me, None)