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:是的