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



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

my_rename test.txt测试。TXT

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

案例1:在区分大小写的文件系统上:

  • 由于存在"test.TXT"错误而中止

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

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

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

  • 将文件重命名为"test.TXT">

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

如有任何建议,我们将不胜感激。

  • Phil

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

可能需要进行一些调试。

最新更新