如何在Perl中执行区分大小写的重命名或移动操作?

时间:2019-06-27 17:30:17

标签: perl case-sensitive

我有一个关于在perl中重命名目录的问题(caveat:需要区分大小写)。

我有一个名为Demo的目录。我有一个重命名目录的脚本,但是我需要区分大小写。

所以演示与演示不同。

例如,我有一个名为Demo的目录。我想将其重命名为CLIENT1。我的脚本称为perlDirRename arg1 arg2。如果提供参数Demo CLIENT1,我希望代码通过,如果提供参数demo 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 个答案:

答案 0 :(得分:5)

  

需要区分大小写的重命名

没有这样的东西。

  

所以演示与演示不同。

这完全取决于您使用的文件系统。在不区分大小写的文件系统上,例如Mac OS(APFS)和Windows(NTFS)上常用的文件系统,实际上Demodemo是同一文件。在区分大小写的文件系统上,Demodemo是不同的。

这是有问题的文件系统的属性,而不是任何特定的操作(例如rename)。

如果即使在不区分大小写的文件系统上,如果传入的名称不是规范形式(即与显示的文件名大小写不匹配),如果您希望程序产生错误,则必须自己获取规范名称并进行比较他们与eq。详细信息取决于您的操作系统。

答案 1 :(得分:1)

整个过程取决于操作系统。在Windows上,这很奇怪。文件名的大小写组成将保留,但出​​于搜索目的将被忽略。这会产生非常奇怪的结果:一旦拥有File.txt,就无法将其重命名为file.txt,因为目录中已经存在file.txt。但是,如果您执行DIR,它仍然是File.txt

答案 2 :(得分:-1)

解决方案。我通过反复试验找到了答案。

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)。