Проверьте, не является ли файл каталогом в Perl

Я знаю, что вы можете проверить, является ли файл каталогом, используя:

if(-d $filename)

но как вы можете проверить, если это не каталог?

4 ответов


вы не думали попробовать следующее?

if (! -d $filename) ...

результат -d - это, в конце концов, то, что можно рассматривать как логическое значение, следовательно, логический оператор not ! будет работать нормально.

и, если вы что-то ищете более конкретную чем "не каталог", см. здесь. Есть довольно много вещей, которые не являются каталогами, которые иногда не имеет смысла рассматривать как обычные файлы.

Keep in имейте в виду, что вы уже подтвердили, что имя файла . если вы ! -d в несуществующем имени файла он вернет true.

это философский вопрос о том, считаете ли вы несуществующую вещь "не каталогом", но, если вы хотите убедиться, что она существует, вы можете использовать ! -d в сочетании с -e, например:

if ((-e $filename) && (! -d $filename)) ...

чтобы проверить, является ли что-то файлом, но не каталогом, вам нужно просто объединить 2 теста (нет ни одного теста):

if (-e $file && !-d $file) { # a file but not a directory }

обратите внимание:

  • при всем уважении, ответ paxdiablo неверен для того, как сформулирован вопрос (pure !-d не работает для того, что пользователь спросил, поскольку он проверяет, является ли случайная вещь / строка не каталогом, а не является ли что-то файлом, который не является каталогом). Е. Г. !-d NO_SUCH_FILE возвращает истинный.

  • ответ Грега может быть правильным в зависимости от того, должен ли исходный пользователь включать не простые файлы (например, символические ссылки, именованные каналы и т. д..) в их определении "файл, который не является каталогом". Если они хотели включить все эти специальные "файлы", ответ Грега также неверен, поскольку "-f" исключает их (как Грег мудро отметил в своем ответе в первую очередь).


в духе TIMTOWTDI:

unless (-d $filename)

на -f оператор проверяет, является ли что-то "обычным файлом". Это исключает каталоги, но также исключает такие вещи, как каналы и узлы устройств.

if (-f $filename) { ...