繁体   English   中英

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

[英]Bash: exit a script when a specified folder is empty via the find command

我想检查文件夹是否为空。 如果是,请编写日志文件并退出脚本。

我的代码如下:

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

并且脚本一直在运行,即使我已将set -e放在脚本的顶部。 我不知道如何解决它。

如果我正确理解了这个问题,这应该有效:

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 之前由shell解析 - 所以重定向到log.txt会发生在整个find命令中, date替换发生在运行find之前, &将find命令放在后台并将该部分视为完全不同的命令。

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

像这样,不需要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

我想(现在)你想要以下内容:

# 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

试试{} +

像这样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM