我曾经认为 -f
测试文件以查看它是否是常规文件,而不是其他文件。但是 Perl 的行为似乎有所不同。我查了perldoc entry ,它说:
-f File is a plain file.
假设我有一个目录,其中有一个名为
file1
的文件。 , 和 5 个符号链接(symbolic link) 1 2 3 4 5
, 每个都指向 file1
,像这样:-rw-r--r-- file1
lrwxrwxrwx 1 -> file1
lrwxrwxrwx 2 -> file1
lrwxrwxrwx 3 -> file1
lrwxrwxrwx 4 -> file1
lrwxrwxrwx 5 -> file1
drwxr-xr-x ../
drwxr-xr-x ./
如果我使用
-type f
在这个目录上运行 find过滤器,它按预期给出输出:% find . -type f
./file1
但是当我使用 -f 运算符运行 perl 脚本时,它会给出以下输出:
% ls | perl -e 'while(<>) { chomp; print "$_\n" if -f $_ }'
1
2
3
4
5
file1
当我添加
-l
的测试时同样,它按预期工作:% ls | perl -e 'while(<>) { chomp; print "$_\n" if -f $_ and not -l $_}'
file1
符号链接(symbolic link)也被视为普通文件吗?如果是这样,为什么?我对文件测试的使用不正确吗?
最佳答案
当你测试一个符号链接(symbolic link)时,除非你使用 -l
符号链接(symbolic link)测试。
这与 stat
类似。和 lstat
行为相似的 Linux 系统调用。也就是说,如果您 stat
符号链接(symbolic link),您将获得符号链接(symbolic link)目标的结果,而如果您 lstat
符号链接(symbolic link),您将获得符号链接(symbolic link)本身的结果。这种行为是有意的,因此天真的程序不必关心符号链接(symbolic link),符号链接(symbolic link)将按预期工作。
你会发现如果你的符号链接(symbolic link)指向一个目录,-f
测试为假,-d
测试是真的。
关于Perl 的文件测试运算符 -f 对符号链接(symbolic link)返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312309/