重命名File :: Find文件夹遍历中的项目

时间:2012-11-16 17:30:06

标签: perl recursion tree

我应该遍历整个文件夹树并将所有内容(包括文件夹)重命名为小写。我环顾四周,看到最好的方法是使用File::Find。我测试了这段代码:

#!/usr/bin/perl -w

use File::Find;
use strict;

print "Folder: ";
chomp(my $dir = <STDIN>);

find(\&lowerCase, $dir);

sub lowerCase{
    print $_," = ",lc($_),"\n";
    rename $_, lc($_);
}

它似乎工作正常。但有人可以告诉我,如果我可能遇到这个代码的麻烦?我记得有关我如何因为在文件之前重命名文件夹或类似事件而遇到麻烦的帖子。

2 个答案:

答案 0 :(得分:2)

  1. 如果你在Windows上 ,正如评论所述,则不会,任何顺序重命名文件或文件夹都不会有问题,因为路径DIR1/file1是与Windows dir1/file1相同。

    但是在Unix上可能会出现问题,在这种情况下你最好手动做一个递归的BFS。

  2. 此外,在进行重命名等系统调用时,总是检查结果:

     rename($from, $to) || die "Error renaming $from to $to: $!";
    
  3. 如评论中所述,请注意将“ABC”重命名为“abc”。在Windows上不是问题。

答案 1 :(得分:0)

就个人而言,我更喜欢:

  1. 使用find dir/ > 2b_renamed
  2. 列出要重命名的文件
  3. 使用选择的编辑器(在我的情况下为vim 2b_renamed
  4. 手动查看列表
  5. 使用该列表中的rename from CPANxargs rename 'y/A-Z/a-z/' < 2b_renamed
  6. 手动审核对我来说非常重要,即使我可以轻松回滚更改(通过git甚至是Time Machine)。