Bash shell脚本以查找目录中缺少的文件/新添加的文件

Bash shell脚本以查找目录中缺少的文件/新添加的文件,bash,shell,sh,bash-completion,bash4,Bash,Shell,Sh,Bash Completion,Bash4,这个程序应该每天运行,这样,如果有任何文件丢失或添加,我可以得到所有这些文件的列表 请给出一些可能的方法。许多实现方法..Psedo代码: ls -ltrh | wc -l 提供当前目录中的文件/文件夹数 每天/根据您的要求检查数字,并比较数值。将shell脚本放在cronjob中,因为您需要每天运行它。实现它的多种方法..Psedo代码: ls -ltrh | wc -l 提供当前目录中的文件/文件夹数 每天/根据您的要求检查数字,并比较数值。将shell脚本放入cronjob中,

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


请给出一些可能的方法。

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

ls -ltrh | wc -l  
提供当前目录中的文件/文件夹数


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

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

ls -ltrh | wc -l  
提供当前目录中的文件/文件夹数


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

我的第一个简单方法是使用隐藏文件跟踪文件列表

假设目录开头包含三个文件

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
$diff.previousfiles.trackedfiles
2d1
d
在这里,删除了
b
,添加了
d

现在,您可以grep输出中的行,以确定添加或删除哪些文件

对上面的
ls
的输出进行排序可能是一个好主意,以确保文件列表始终处于相同的顺序。(只需编写
ls | sort>.trackedfiles
即可。)

这种方法的一个缺点是没有覆盖隐藏的文件。这可以通过a)也列出隐藏文件和b)将跟踪文件从流程中排除来解决


正如在另一个答案中提到的,该脚本可以由cron作业定期运行。

我的第一个简单方法是使用隐藏文件跟踪文件列表

假设目录开头包含三个文件

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
$diff.previousfiles.trackedfiles
2d1
d
在这里,删除了
b
,添加了
d

现在,您可以grep输出中的行,以确定添加或删除哪些文件

对上面的
ls
的输出进行排序可能是一个好主意,以确保文件列表始终处于相同的顺序。(只需编写
ls | sort>.trackedfiles
即可。)

这种方法的一个缺点是没有覆盖隐藏的文件。这可以通过a)也列出隐藏文件和b)将跟踪文件从流程中排除来解决


如另一个答案中所述,脚本可以由cron作业定期运行。

您可以设置每日cron作业,根据当前的
日期
输出检查目录中所有文件的出生时间,以查看它是否是在最近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

您可以设置每日cron作业,根据当前的
日期
输出检查目录中所有文件的出生时间,以查看它是否在过去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

这里有一个小脚本,可以实现您想要的功能。它很脏,几乎没有支票,但它可以做你想做的事:

#!/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
#/bin/bash
#你想看的目录
WATCHDIR=~/code
#上次选中时将保留文件列表的文件的名称
LAST=$WATCHDIR/LAST.log
#将保留您正在检查的文件列表的文件的名称
当前=/tmp/last.log
#第一次创建日志文件时
最后触摸$
查找$WATCHDIR-键入f>$CURRENT
差异$LAST$CURRENT>/dev/null 2>&1
#如果没有区别,退出
如果[$?-等式0]
然后
回应“没有变化”
其他的
#否则,请列出已更改的文件
回显“新文件列表”
差异$LAST$当前| grep'^>'
回显“已删除的文件列表”

diff$LAST$CURRENT | grep'^这里有一个小脚本,可以实现您想要的功能。它很脏,几乎没有支票,但它可以做你想做的事:

#!/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
#/bin/bash
#你想看的目录
WATCHDIR=~/code
#上次选中时将保留文件列表的文件的名称
LAST=$WATCHDIR/LAST.log
#将保留您正在检查的文件列表的文件的名称
当前=/tmp/last.log
#第一次创建日志文件时
最后触摸$
查找$WATCHDIR-键入f>$CURRENT
差异$LAST$CURRENT>/dev/null 2>&1
#如果没有区别,退出
如果[$?-等式0]
然后
回应“没有变化”
其他的
#否则,请列出已更改的文件
回显“新文件列表”
差异$LAST$当前| grep'^>'
回显“已删除的文件列表”

diff$LAST$CURRENT | grep'^您可能想看看
watch
。您可能想看看
watch
@migu他的代码不是用来显示任何内容的,它只是将当前文件夹的状态与旧值进行比较,以查看文件夹中是否有更改。它不是很准确,而且很容易出错。@Ploutox:是的,它是用来显示一些东西的。你忽略了“我可以得到所有这些文件的列表”这句话。@migu I know OP要求一个函数来显示修改文件的列表。然而,user3505725提供了一个关于修改的文件检测部分的解决方案。我相信他知道这并不能回答全部问题,但他认为这将有助于OP使用此代码构建最终脚本。@migu他的代码并不是要显示任何内容,它只是将当前文件夹的状态与旧值进行比较,以查看文件夹中是否有更改。它不是很准确,而且很容易出错。@Ploutox:是的