我想查看某个文件夹中是否存在文件,如果存在,则运行某些事件,否则跳过此步骤。 Bash看到我空文件夹中的文件。
我尝试了几种不同的方式,并且都显示文件已退出。
$ [ -f ] && echo "Found" || echo "Not found"
Found
$ [ -r ] && echo "Found" || echo "Not found"
Found
$ [ -e ] && echo "Found" || echo "Not found"
Found
虽然它没有:
$ ls -lrt
total 0
我在这里缺少什么?
我的实际代码是:
get_last_parsed_file_time ()
{
if [ -s "$DATA_DIR$EPG_XML_FILES" ]
then
NEWEST_FILE=$( ls -tr | tail -1 )
LAST_PARSED_TIME=$( stat -c %Y $NEWEST_FILE )
else
NO_FILE=1
fi
}
答案 0 :(得分:4)
[ -f filename ]
检查filename
是否为存在的文件。
[ str ]
检查str
是否为非空。
在你的情况下,str
是-f
,但它仍然只是检查 string "-f"
是否非空,这显然不是(它是两个)字符,短划线和"f"
)。
[ -f $filename ]
的情况尤其令人费解。当$filename
为空且未加引号时,该命令将变为[ -f ]
并且为真。总是引用你的变量。
答案 1 :(得分:0)
that other guy's answer解释了为什么[ -f ]
不起作用。
更一般地说,重要的是要注意你不能将全局(文件名模式,例如*
)传递给bash文件测试操作符,例如-f
文件测试操作符需要单个,文字文件名或文件路径(作为字符串文字或存储在变量中的字符串)。
[[ -f '/path/to/file' ]] # correct
[[ -f /path/to/* ]] # WRONG
这是一个测试文件夹是否为空的片段,即它是否包含任何项目 - 无论是文件,隐藏文件还是子文件夹:
folder='/path/to/folder'
[[ -n $(ls -A "$folder" | head -n 1) ]] && echo "NON-empty" || echo "EMPTY"
-A
命令中删除ls
。2> /dev/null
附加到ls
命令。