Раньше я думал, что -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 с помощью оператора -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
Считаются ли символические ссылки простыми файлами? Если да, то почему? Является ли мое использование файла test неправильным?