Perl 的文件测试运算符 -f 对符号链接(symbolic link)返回 true

标签 perl shell unix find

我曾经认为 -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/

相关文章:

java - 以编程方式配置 Filebeat Shippers

UNIX 有效密码

bash - 将两个文件粘贴到第一个文件

javascript - 不同 Markdown 实现中的 'corner cases' 是什么?

regex - 有没有办法在单个语句中将某个函数的返回值编译成正则表达式?

python - 在不创建序列文件的情况下运行 BLAST (bl2seq)

linux - 编写shell脚本的shell脚本

perl - split() 但保留分隔符

python - aws crontab 无法使用子进程工作

linux - Unix/Linux系统的权限