获取区分大小写的文件名

Phi*_*vey 4 perl case-insensitive file-rename

我有一个需要在任何平台(Windows、Mac、Linux 等)上运行的 Perl 脚本。它的部分功能是重命名文件,但我不希望它覆盖现有文件。假设该脚本名为“my_rename”,它采用与“rename”函数相同的参数,并且用户执行以下命令:

my_rename test.txt test.TXT
Run Code Online (Sandbox Code Playgroud)

-e "test.txt"如果和-e "test.TXT"都返回 true,就会出现问题。以下是我想在以下条件下处理这种情况的方法:

情况 1:在区分大小写的文件系统上:

  • 中止并出现“test.TXT”存在的错误

情况 2:在不区分大小写的文件系统上,当现有文件名的实际大小写为“test.TXT”时:

  • 发出文件名未更改的警告

情况 3:在不区分大小写的文件系统上,当现有文件名的实际大小写不是“test.TXT”时:

  • 将文件重命名为“test.TXT”

由于该脚本必须是可移植的,因此它不能依赖于系统相关的函数或实用程序。

Tan*_*lus 6

我过去在这里所做的就是跳过-e并直接转到readdir.

在输入上,您需要知道有多少个不区分大小写的与 readdir 匹配的内容。

if (! -e $input)
{
  die "No such file: $input";
}

my $input_case_insensitive_matches = () = use_readdir_to_find($input);
my $output_is_case_match = use_readdir_to_find($output);

if ($input_case_insensitive_matches > 1 && $output_is_case_match)
{
  # case sensitive filesystem, target exists, as does the input file
  die "$output already exists";
}

if ($output_is_case_match)
{
  # case insensitive filesystem, no change required
  warn "$input is already $output";
}
else
{
  # case can be changed
  rename $input, $output;
}
Run Code Online (Sandbox Code Playgroud)

可能需要一些调试。

  • 它使用上下文 - 返回列表上下文中的所有不区分大小写的匹配项,以及标量上下文中的精确区分大小写的匹配项(或不返回任何内容)。或者使用不同的功能,无论如何。 (2认同)