我知道您可以使用以下方法测试文件是否为目录:
if(-d $filename)
但是如何测试它是否不是目录?
答案 0 :(得分:15)
您是否考虑过尝试以下操作?
if (! -d $filename) ...
毕竟,-d
的结果可以被视为一个布尔值,因此逻辑非运算符!
将正常工作。
而且,如果您正在使用更具体的而不是“非目录”,请参阅here。有很多东西不是目录,有时候它们作为常规文件处理是没有意义的。
请记住,假设您已经验证了文件名的存在。如果您对不存在的文件名执行! -d
,它将返回true。
关于你是否认为一个不存在的东西是“不是一个目录”是一个哲学问题,但是,如果你想确保它也存在,你可以将! -d
与{{1}结合使用类似于:
-e
答案 1 :(得分:5)
要测试某件事是否是文件,但不是目录,您需要简单地组合2个测试(没有单个测试):
if (-e $file && !-d $file) { # a file but not a directory }
请注意:
得到应有的尊重,paxdiablo对问题措辞方式的回答是错误的(纯!-d
不适用于用户询问的内容,因为它检查随机的东西/字符串是不是目录,不是某个东西是不是目录的文件)。例如。 !-d NO_SUCH_FILE
返回true。
Greg的答案可能是正确的,完全取决于原始用户是否要在其“文件不是目录”的定义中包含非普通文件(例如符号链接,命名管道等)。如果他们打算包括所有那些特殊的“文件”,格雷格的回答也是错误的,因为“-f”排除了他们(正如Greg在他的回答中明智地指出的那样)。
答案 2 :(得分:3)
本着TIMTOWTDI的精神:
unless (-d $filename)
答案 3 :(得分:2)
-f
运算符测试是否某些内容是“常规文件”。这会排除目录,但也会排除管道和设备节点之类的内容。
if (-f $filename) { ...