Единственным определяющим источником для имени файла является сама файловая система. В этом фрагменте перечислены записи в родительском каталоге целевого каталога и проверяется, что указанное имя точно совпадает с одной из этих записей. Я тестировал Linux из удаленного NTFS-ресурса (смонтированного с помощью CIFS).
use File::Basename;
$target = shift;
($base,$parent) = fileparse($target);
opendir($PARENT,$parent)
or die("Error opening '$parent': $!");
%entries = map { $_ => 1 } readdir($PARENT);
closedir($PARENT);
if (-d $target && exists($entries{$base})) {
print("'$target' exists (and correct case)\n");
} else {
print("'$target' does not exist.\n");
}
Я не могу представить себе, как вы могли бы испытать эту проблему вне зависимости от регистра файловой системы (например, NTFS, (V) FAT, другие?), И проблема с ними (по крайней мере, когда Windows, является OS, управляющая им) заключается в том, что вы не можете гарантировать, что случай ввода файловой системы - это то, что вы хотите. Например, попробуйте переименовать файл NTFS, изменяя только случай. В Windows имя файла не изменяется. Вам нужно будет полностью изменить его на что-то другое, а затем изменить его на прежнее имя с правильным случаем. Существуют (или были) настраиваемые параметры Windows, которые делают специальные вещи, если имя файла имеет верхний регистр.
Еще одна вещь, которую следует учитывать, заключается в том, что если файловая система не чувствительна к регистру, то нет никакой возможности, что в одном каталоге могут быть две записи, которые отличаются только по отдельности. Я просто не понимаю, какая полезная непредвиденная ситуация для этой проверки.
Есть ли какой-либо причине вы не можете комбинировать '-d' с' eq'? – TLP
@TLP Что значит? Как именно вы это сделаете? – RogueCSDev
'-d' будет чувствителен к регистру как файловая система, поэтому, если файловая система не является файловой системой NTFS или (V) FAT, она, скорее всего, будет вести себя так, как вы хотите. – mojo