0

该程序应该每天运行,以便如果丢失或添加任何文件,我可以获得所有这些文件的列表。

请一些1建议可能的方式。

4

5 回答 5

4

在这里,您有一个小脚本可以执行您想要的操作。它很脏,几乎没有检查,但它会做你想做的事:

#!/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
于 2014-07-31T08:30:47.630 回答
1
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
于 2014-07-31T08:23:33.770 回答
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 作业定期运行。

于 2014-07-31T07:46:01.487 回答
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
于 2014-07-31T08:06:05.280 回答
-1

实现它的许多方法..Psedo 代码:

ls -ltrh | wc -l  

为您提供当前目录中的文件/文件夹数量

每天/根据您的要求检查数字并比较值。将 shell 脚本放入 cronjob 中,因为您需要每天运行它

于 2014-07-31T07:40:55.880 回答