这个程序应该每天运行,这样如果遗漏或添加任何文件,我可以获得所有这些文件的列表。
请一些可能的方法。
答案 0 :(得分:3)
在这里你有一个小脚本可以做你想要的。它很脏,几乎没有检查,但它会做你想要的:
#!/bin/bash
# Directory you want to watch
WATCHDIR=~/code
# Name of the file that will keep the list of the files when you last checked it
LAST=$WATCHDIR/last.log
# Name of the file that will keep the list of the files you are checking now
CURRENT=/tmp/last.log
# The first time we create the log file
touch $LAST
find $WATCHDIR -type f > $CURRENT
diff $LAST $CURRENT > /dev/null 2>&1
# If there is no difference exit
if [ $? -eq 0 ]
then
echo "No changes"
else
# Else, list the files that changed
echo "List of new files"
diff $LAST $CURRENT | grep '^>'
echo "List of files removed"
diff $LAST $CURRENT | grep '^<'
# Lastly, move CURRENT to LAST
mv $CURRENT $LAST
fi
答案 1 :(得分:0)
我的第一个天真的方法是使用隐藏文件来跟踪文件列表。
假设目录在开头包含三个文件。
a
b
c
将列表保存在隐藏文件中:
ls > .trackedfiles
现在添加了文件d
:
$ ls
a b c d
保存以前的状态并记录新状态:
mv .trackedfiles .previousfiles
ls > .trackedfiles
要显示差异,您可以使用diff:
$ diff .previousfiles .trackedfiles
3a4
> d
Diff显示d仅在正确的文件中。
如果添加和删除文件,diff会显示如下内容:
$ diff .previousfiles .trackedfiles
2d1
< b
3a3
> d
此处,b
已删除,并添加了d
。
现在,您可以grep输出中的行以确定添加或删除的文件。
对上面的ls
输出进行排序可能是一个好主意,以确保文件列表始终处于相同的顺序。 (只需改为编写ls | sort > .trackedfiles
。)
这种方法的一个缺点是不包含隐藏文件。这可以通过以下方法解决:a)列出隐藏文件,以及b)从流程中排除跟踪文件。
如在另一个答案中提到的那样,脚本可以定期由cron作业运行。
答案 2 :(得分:0)
您可以设置每日cron作业,该作业会根据当前date
输出检查目录中所有文件的生成时间,以查看它是否是在过去24小时内创建的。
current=$(date +%s)
for f in *; do
birth=$(stat -c %W "$f")
if [ $((current-birth)) -lt 86400 ]; then
echo "$f" >> new_files
fi
done
答案 3 :(得分:0)
write your own diff script like this
#!/bin/bash
#The first time you execute the script it create old_list file that contains your directory content
if [[ ! -f old_list ]] ; then
ls -t1 > old_list ;
echo "Create list of directory content" ;
exit
fi
#Create new file 'new_list' that contains new directory content
ls -t1 > new_list
#Get a list of modified file (created and/or deleted)
MODIFIED=$(cat old_list new_list | sort | uniq -u)
for i in $MODIFIED ;
do
EXIST=$(echo $i | grep old_list)
#if exist in old_list so its newly deleted
if [[ ! -z "$EXIST" ]] ; then
echo "file : $i deleted"
else
echo "file $i added"
fi
done
#Update old_content content
ls -t1 > old_content ;
exit
答案 4 :(得分:-1)
实现它的许多方法..Psedo代码:
ls -ltrh | wc -l
为您提供当前目录中的文件/文件夹数
根据您的要求每天检查一次数字并比较该值。将shell脚本放在cronjob中,因为您需要每天运行它