[英]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.