Я знаю, что вы можете проверить, является ли файл каталогом, используя:
if(-d $filename)
но как вы можете проверить, если это не каталог?
Я знаю, что вы можете проверить, является ли файл каталогом, используя:
if(-d $filename)
но как вы можете проверить, если это не каталог?
Вы не думали попробовать следующее?
if (! -d $filename) ...
В конце концов, результат -d
можно рассматривать как логическое значение, поэтому логический оператор not !
будет работать нормально.
А если вам нужно что-то более конкретное, чем "не каталог", см. здесь. Есть довольно много вещей, которые не являются каталогами, и иногда не имеет смысла обращаться с ними как с обычными файлами.
Имейте в виду, что предполагается, что вы уже подтвердили, что имя файла существует. Если вы сделаете ! -d
для несуществующего имени файла, будет возвращено значение true.
Это философский вопрос, считаете ли вы несуществующую вещь «не каталогом», но если вы хотите убедиться, что она также существует, вы можете использовать ! -d
в сочетании с -e
, что-то вроде:
if ((-e $filename) && (! -d $filename)) ...
!-d NO_SUCH_FILE
возвращает true).
- person DVK; 11.10.2011
Чтобы проверить, является ли что-то файлом, НО не каталогом, вам нужно просто объединить 2 теста (единого теста нет):
if (-e $file && !-d $file) { # a file but not a directory }
Обратите внимание, что:
При всем уважении, ответ paxdiablo неверен из-за того, как сформулирован вопрос (чистый !-d
не работает для того, что задал пользователь, поскольку он проверяет, не является ли случайная вещь/строка каталогом, НЕ является ли что-то файлом, который не является каталог). Например. !-d NO_SUCH_FILE
возвращает истину.
Ответ Грега может быть правильным полностью в зависимости от того, намеревался ли первоначальный пользователь включать непростые файлы (например, символические ссылки, именованные каналы и т. д.) в свое определение «файла, который не является каталогом». Если они хотели включить все эти специальные «файлы», ответ Грега также неверен, поскольку «-f» исключает их (как мудро заметил Грег в своем ответе в первую очередь).
В духе TIMTOWTDI:
unless (-d $filename)
Оператор -f
проверяет, является ли что-то «обычным файлом». Это исключает каталоги, но также исключает такие вещи, как каналы и узлы устройств.
if (-f $filename) { ...