Bash:当指定文件夹为空时通过find命令退出脚本

时间:2019-04-03 21:01:18

标签: bash

我要检查文件夹是否为空。如果是,则写一个日志文件并退出脚本。

我的代码如下:

L

但是,我收到了

find $folder -maxdepth 0 -empty -exec echo [`date`] $folder is empty > log.txt & exit 0 \;

您能帮我解决问题吗?

谢谢!

================================================ ===========

编辑:

谢谢大家!

我只是试图只退出没有输出日志的脚本:

find: missing argument to `-exec'

find $folder -maxdepth 0 -empth -exec exit 0 \;

我收到错误:

find $folder -type d -empty -exec exit 0 \;

即使我将find: ‘exit’: No such file or directory 放在脚本顶部,该脚本也继续运行。 我不知道如何解决它。

4 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,这应该可以工作:

if find "$folder" -maxdepth 0 -empty | grep -q "."; then
    echo "[$(date)] $folder is empty" > log.txt    # Should this be >> to append?
    exit 0
fi

说明:如果目录$folder为空,则find命令将显示其路径; grep检查是否有东西(“ .”是与任何字符匹配的模式),如果有匹配,则退出并显示成功状态;然后if语句根据grep的退出状态运行或跳过其内容。

说明原始文件为何不起作用的原因:-exec中的命令不是完整的shell命令,只是一系列要传递给execl()系统调用的单词(或相关功能)。也就是说,它是可执行文件的文件名(通常在PATH中找到),后跟要传递给它的参数列表。

这有两个重要的含义:您不能在命令中使用任何任何 shell功能,因此不能进行重定向(> log.txt),不能使用&;|或类似的东西,没有变量替换,等等。对于您的命令,所有这些东西都将在传递结果之前由外壳 解析。到find的位置-因此,重定向到log.txt的操作发生在整个find命令中,date的替换发生在运行find之前,&放置在后台执行find命令,并将之后的部分视为完全不同的命令。

此外,exit不是可以与execl()等一起运行的常规命令;它是内置的shell(尝试type -a exit),因此无法由-exec执行。即使可以,它也不会做您想要的事情,因为-exec运行的命令是作为子进程运行的,它只会退出该子进程,而不是整个脚本(甚至是{{1 }}命令。

答案 1 :(得分:0)

就像这样,不需要find -maxdepth 0

#!/bin/bash

shopt -s dotglob # enable globing even with .hidden files

for dir in */; do
    if ! stat $dir/* &>/dev/null; then 
        echo "[$(date)] $dir is empty" | tee log.txt
        break
    fi
done

答案 2 :(得分:0)

我认为(现在)您需要以下条件:

# Exit if the current folder is empty
if [ $(find "${folder}" -maxdepth 0 -empty | wc -c) -gt 0 ] ; then
    printf "[%s] %s is empty\n" "$(date)" "${folder}" >> log.txt
    exit 0
fi

答案 3 :(得分:-2)

尝试使用{} +

像这样

find $folder -maxdepth 0 -empty -exec echo [`date`] $folder is empty {} + > log.txt & exit 0