测试文件是否不是Perl中的目录

sj7*_*755 7 perl file operators conditional-statements

我知道您可以使用以下方法测试文件是否是目录:

if(-d $filename)
Run Code Online (Sandbox Code Playgroud)

但是如何测试它不是目录呢?

pax*_*blo 16

你有没有想过尝试以下?

if (! -d $filename) ...
Run Code Online (Sandbox Code Playgroud)

-d毕竟,结果是可以被视为布尔值的东西,因此逻辑非运算符!将正常工作.

而且,如果您正在寻找比"非目录" 更具体的内容,请参阅此处.有很多东西不是目录,有时候作为常规文件处理是没有意义的.

请记住,假设您已经验证了文件名存在.如果! -d对不存在的文件名执行操作,则返回true.

这是一个哲学问题,你是否认为一个不存在的东西是"不是一个目录",但是,如果你想确保它也存在,你可以! -d结合使用-e,例如:

if ((-e $filename) && (! -d $filename)) ...
Run Code Online (Sandbox Code Playgroud)

  • 我只是不能足够快地达到30个字符......我认为这个问题实际上让我震惊. (3认同)
  • 请注意:根据您解析OP的需要,这个答案可能是错误的.我解析它的方式,他想知道某些东西是文件而不是目录 - 即使对于那些不是第一个文件的东西(例如`!-d NO_SUCH_FILE`返回true),这个答案也会返回true. (2认同)

DVK*_*DVK 5

要测试某些东西是否是文件,但不是目录,您需要简单地组合2个测试(没有单个测试):

if (-e $file && !-d $file) { # a file but not a directory }
Run Code Online (Sandbox Code Playgroud)

请注意:

  • 在充分尊重的情况下,paxdiablo的答案对于问题措辞的方式是错误的(纯粹!-d不适用于用户在检查随机事物/字符串是否不是目录时所询问的内容,而不是某些事物是否是某个文件不是目录).例如,!-d NO_SUCH_FILE返回true.

  • Greg的答案可能是正确的,完全取决于原始用户是否在其"文件不是目录"的定义中包含非普通文件(例如符号链接,命名管道等).如果他们打算包括所有那些特殊的"文件",格雷格的回答也是错误的,因为"-f"排除了他们(正如Greg在他的回答中明智地指出的那样).