该程序应该每天运行,以便如果丢失或添加任何文件,我可以获得所有这些文件的列表。
请一些1建议可能的方式。
在这里,您有一个小脚本可以执行您想要的操作。它很脏,几乎没有检查,但它会做你想做的事:
#!/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
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
我的第一个天真的方法是使用隐藏文件来跟踪文件列表。
假设目录开头包含三个文件。
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 作业定期运行。
您可以设置一个每日 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
实现它的许多方法..Psedo 代码:
ls -ltrh | wc -l
为您提供当前目录中的文件/文件夹数量
每天/根据您的要求检查数字并比较值。将 shell 脚本放入 cronjob 中,因为您需要每天运行它