0
#! /bin/sh

while [ ! -r '*.pdf' ]
do
        echo "No pdf files have been created in the last 5 mins."
        sleep 5
done

while [ -r '*.pdf' ]
do
    echo "The following pdf file(s) have been created in the last 5 mins:"
    find -mmin -5 -iname '*.pdf'
    sleep 5
done

有什么想法为什么即使在过去 5 分钟内制作了一些 .pdf 文件也不会进入第二个循环?可能是非常错误的代码,任何想法都非常感谢!

4

2 回答 2

3

诊断

对于第一个循环,您有:

while [ ! -r '*.pdf' ]

测试条件正在寻找一个名为*.pdf(没有通配符;一个精确命名的文件*.pdf)的文件,因为您将名称用引号括起来。

对于第二个循环,您有:

while [ -r '*.pdf' ]

这也在寻找*.pdf(而不是名称)。因此,除非在极少数情况下存在名为 的文件*.pdf,否则这些循环不会按预期工作。

处方

你可能会使用:

while x=( $(find -mmin -5 -iname '*.pdf') )
do
    if [ -z "${x[*]}" ]
    then echo "No pdf files have been created in the last 5 mins."
    else
        echo "The following pdf file(s) have been created in the last 5 mins:"
        print "%s\n" "${x[@]}"
    fi
    sleep 5
done

这使用数组赋值为您提供名称列表。它并不完美;如果文件名中有空格,您最终会得到损坏的名称。解决这个问题并不完全是微不足道的。但是,仔细选择"${x[*]}"从数组中的名称(如果有的话)制造单个字符串,我们可以测试新文件。找到新文件后,使用printf和在单独的行上报告它们的名称"${x[@]}",这会为每行输出提供一个名称。

于 2013-05-31T06:45:05.587 回答
0
while [ -r '*.pdf' ]

通过引用,您是在告诉 Bash 准确查找名为 的文件*.pdf,而您可能想要的是通配符扩展。如果是这种情况,您需要删除引号,至少在*

while [ -r *.pdf ]
于 2013-05-31T06:32:16.673 回答