shell 运行命令后检查是否已在目录上创建新文件的Bash脚本

ia2d9nvy  于 2023-03-09  发布在  Shell
关注(0)|答案(4)|浏览(194)

通过使用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脚本,在互联网上搜索了很多,但找不到我需要的。任何帮助将不胜感激。谢谢。
ndasle7k

ndasle7k1#

下面是我如何让它工作的。它也被设置成这样,你可以有多个监视目录与相同的脚本与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
fcwjkofz

fcwjkofz2#

感谢这些信息丰富的评论,我刚刚意识到我错过了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

它在第一次运行时输出“更改”,在另一次运行时输出“无更改”,除非您删除新添加的文档。

pftdvrlh

pftdvrlh3#

我试图将您的脚本(其中包含一些错误)解释为对您的需求的理解。
我认为最简单的方法是将ls命令输出重定向到指定的文件,然后将这些文件重定向:

#!/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

如果任何文件被“命令”修改,即文件存在于“之前”列表中,但可能会发生变化,以上将不会显示为差异。
在这种情况下,您最好使用一个“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 {} \;

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

mzillmmw

mzillmmw4#

stackexchange中尝试watchdir脚本
你也可以用管道输送。

watchdir folder1 folder2 | while read -r line; do filename="${line##*/}"; echo "$filename"; done

这将打印每个新文件名或更改的文件名

相关问题