Perl:获取文件的区分大小写的名称

时间:2019-01-22 15:23:02

标签: perl case-sensitive file-rename case-insensitive

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

my_rename test.txt test.TXT

如果-e“ test.txt”和-e“ test.TXT”都返回true,则会出现问题。在以下情况下,我想如何处理这种情况:

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

  • 中止并显示“ test.TXT”错误

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

  • 警告文件名未更改

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

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

由于该脚本必须具有可移植性,因此不能依赖于系统相关的功能或实用程序。

任何建议将不胜感激。

  • 菲尔

1 个答案:

答案 0 :(得分:4)

我过去在这里所做的就是跳过-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;
}

可能需要一些调试。