Раньше я думал, что -f
проверил файл, чтобы узнать, был ли он обычным файлом, а не что-то еще. Но Perl, похоже, ведет себя по-другому. Я просмотрел запись perldoc, и она говорит:
-f File is a plain file.
Предположим, что у меня есть каталог, имеющий один файл с именем file1
и 5 символических ссылок 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 ./
Если я запустил find в этом каталоге, используя фильтр -type f
, он выдаст результат, как ожидалось:
% find . -type f
./file1
Но когда я запускаю perl script с помощью оператора -f, он дает следующий вывод:
% 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
Являются ли символические ссылки одинаковыми? Если да, то почему? Является ли неправильным использование теста файла?