Bash脚本,用于检查在运行命令后是否在目录上创建了新文件



通过使用bash脚本,我试图检测在运行命令时是否在目录上创建了文件。让我来说明这个问题;

#!/bin/bash
# give base directory to watch file changes
WATCH_DIR=./tmp

# get list of files on that directory
FILES_BEFORE= ls $WATCH_DIR
# actually a command is running here but lets assume I've created a new file there.
echo >$WATCH_DIR/filename
# and I'm getting new list of files.
FILES_AFTER= ls $WATCH_DIR  
# detect changes and if any changes has been occurred exit the program.

之后,我只是试图比较这些FILES_BEFOREFILES_AFTER,但无法完成。我试过了,

  1. comm -23 <($FILES_AFTER |sort) <($FILES_BEFORE|sort)
  2. diff $FILES_AFTER $FILES_BEFORE > /dev/null 2>&1
  3. cat $FILES_AFTER $FILES_BEFORE | sort | uniq -u

他们都没有给我一个结果来理解是否有变化。我需要的是检测变化和退出程序,如果有的话。我不是很擅长这个bash脚本,在互联网上搜索了很多,但是找不到我需要的东西。任何帮助都将不胜感激。谢谢。

我是这样让它工作的。还设置了它,以便您可以使用cron拥有具有相同脚本的多个监视目录。例如,如果您希望每分钟运行一次。

* * * * * /usr/local/bin/watchdir.sh /makepdf

,每小时一次。

0 * * * * /user/local/bin/watchdir.sh /incoming

#!/bin/bash
WATCHDIR="$1"
NEWFILESNAME=.newfiles$(basename "$WATCHDIR")
if [ ! -f "$WATCHDIR"/.oldfiles ]
then
ls -A "$WATCHDIR" > "$WATCHDIR"/.oldfiles
fi
ls -A "$WATCHDIR" > $NEWFILESNAME
DIRDIFF=$(diff "$WATCHDIR"/.oldfiles $NEWFILESNAME | cut -f 2 -d "")
for file in $DIRDIFF
do
if [ -e "$WATCHDIR"/$file ];then
#do what you want to the file(s) here
echo $file
fi
done
rm $NEWFILESNAME

多亏了这些信息丰富的评论,我才意识到我错过了bash脚本的基础知识,但最终还是成功了。我将把我的解决方案留在这里,作为对那些像我一样挣扎的人的回答。

WATCH_DIR=./tmp
FILES_BEFORE=$(ls $WATCH_DIR)
echo >$WATCH_DIR/filename
FILES_AFTER=$(ls $WATCH_DIR)
if diff <(echo "$FILES_AFTER") <(echo "$FILES_BEFORE")
then
echo "No changes"
else
echo "Changes"
fi

输出"Changes"在第一次运行和"没有变化";对于另一个,除非您删除新添加的文档。

我正试图解释您的脚本(其中包含一些错误),以了解您的需求。

我认为最简单的方法是简单地将ls命令输出重定向到命名文件,然后diff这些文件:

#!/bin/bash
# give base directory to watch file changes
WATCH_DIR=./tmp

# get list of files on that directory
ls $WATCH_DIR > /tmp/watch_dir.before
# actually a command is running here but lets assume I've created a new file there.
echo >$WATCH_DIR/filename
# and I'm getting new list of files.
ls $WATCH_DIR > /tmp/watch_dir.after
# detect changes and if any changes has been occurred exit the program.
diff -c /tmp/watch_dir.after /tmp/watch_dir.before

如果任何文件被'命令'修改,即文件存在于'before'列表中,但可能发生变化,以上将不会显示为差异。

在这种情况下,您最好使用创建的'marker'文件来标记监视启动的实例,然后使用find命令列出自market文件以来的任何更新/修改的文件。像这样:

#!/bin/bash
# give base directory to watch file changes
WATCH_DIR=./tmp

# get list of files on that directory
ls $WATCH_DIR > /tmp/watch_dir.before
# actually a command is running here but lets assume I've created a new file there.
echo >$WATCH_DIR/filename
# and I'm getting new list of files.
find $WATCH_DIR -type f -newer /tmp/watch_dir.before -exec ls -l {} ;

这不会显示任何被删除的文件,所以也许可以使用混合列表。

最新更新