Bash shell脚本找出目录中丢失的文件/新添加的文件

时间:2014-07-31 07:26:18

标签: bash shell sh bash-completion bash4

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

请一些可能的方法。

5 个答案:

答案 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中,因为您需要每天运行它