Как я могу сделать чувствительный к регистру операцию переименования или перемещения в Perl? - PullRequest
3 голосов
/ 27 июня 2019

У меня есть вопрос о переименовании директории в perl (caveat: должно быть регистрозависимое переименование).

У меня есть каталог с именем Demo. У меня есть скрипт, который переименовывает каталог, но мне нужно, чтобы он учитывал регистр.

То есть демо НЕ то же самое, что демо.

Например, у меня есть каталог с именем Demo. Я хочу переименовать это, чтобы быть КЛИЕНТОМ1. Мой скрипт называется perlDirRename arg1 arg2. Я хочу, чтобы код прошел, если я предоставляю аргументы Demo CLIENT1, и выдает ошибку, если я предоставляю аргументы демо CLIENT1

Итак, резюмируем:

./perlDirRename Demo CLIENT1 (проходной)

./perlDirRename demo CLIENT1 (сбой)

Вот фрагмент кода:

my $from_dir = $ARGV[0];
my $to_dir = $ARGV[1];

if ($from_dir eq $to_dir) {
  print("Arguments cannot be equal!\n");
  exit(1);
}


move("$dirHome/$from_dir", "$dirHome/$to_dir") or die "Move failed: $!";

Как выполнить операцию переименования или перемещения с учетом регистра в perl?

Ответы [ 3 ]

5 голосов
/ 27 июня 2019

должно быть регистрозависимым переименованием

Такой вещи нет.

Так что демо НЕ то же самое, что демо.

Это полностью зависит от используемой вами файловой системы.В нечувствительной к регистру файловой системе, такой как системы, обычно используемые в Mac OS (APFS) и Windows (NTFS), Demo фактически является тем же файлом, что и demo.В чувствительной к регистру файловой системе Demo и demo различаются.

Это свойство рассматриваемой файловой системы, а не какая-либо конкретная операция (например, rename).

Если вы хотите, чтобы ваша программа выдавала ошибку, если переданное имя не в канонической форме (то есть не соответствует отображаемому регистру имени файла) даже в нечувствительных к регистру файловых системах, вы должны сами получить каноническое имя и сравнить ихс eq.Детали зависят от вашей ОС.

1 голос
/ 27 июня 2019

Все зависит от ОС. В Windows это довольно странно. Регистр имен файлов сохраняется, но для целей поиска он игнорируется. Это приводит к действительно странным результатам: если у вас есть File.txt, вы не можете переименовать его в file.txt, потому что для file.txt уже есть в каталоге. Но если вы сделаете DIR, это все равно File.txt

0 голосов
/ 28 июня 2019

Решение.Я нашел много проб и ошибок.

if (-d "$dirHome/$from_dir" && exists($entries{$from_dir})) { 
  move("$dirHome/$from_dir", "$dirHome/$to_dir") or die "The move operation failed: $!";
} else {
  print("Cannot find source directory $from_dir\n");
  exit(1);
}

Позвольте мне лучше объяснить:

-d проверяет наличие каталога, но в Linux он не учитывает регистр.Поэтому exists($entries{$from_dir}) проверяет, имеет ли родительский каталог, который мы перечислили ранее, подкаталог с точным именем, которое мы ищем.Если оба из перечисленных правил верны, он использует move () для выполнения эквивалента mv (1) между каталогами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...