我要检查文件夹是否为空。如果是,则写一个日志文件并退出脚本。
我的代码如下:
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
放在脚本顶部,该脚本也继续运行。
我不知道如何解决它。
答案 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