【问题标题】:Perl: Get case-sensitive name of filePerl:获取区分大小写的文件名
【发布时间】:2019-06-16 02:36:44
【问题描述】:

我有一个需要在任何平台(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”

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

任何建议将不胜感激。

  • 菲尔

【问题讨论】:

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


    【解决方案1】:

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

    可能需要进行一些调试。

    【讨论】:

    • 感谢您的建议,但您似乎已经假设文件系统不区分大小写。我不能做出这样的假设。此外,对于包含 Unicode 字符的文件名,readdir 在 Windows 中被严重破坏。
    • 我不认为我在做前一个假设,但我不知道 unicode 方面。
    • 啊。我现在明白了。在两个文件都存在的区分大小写的系统上,不区分大小写的 readdir 搜索将找到多个文件。知道了。不过,这仍然让 Unicode 头疼。
    • 我很困惑,因为 use_readdir_to_find() 在搜索 $input 时必须不区分大小写,但对于 $output 则区分大小写。
    • 它正在使用上下文 - 在列表上下文中返回所有不区分大小写的匹配项,在标量上下文中返回完全区分大小写的匹配项(或不返回任何内容)。或者使用不同的功能,无论如何。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多