递归重命名目录名称

时间:2012-01-18 22:30:45

标签: linux perl bash

我想通过将所有出现的空格更改为下划线来重命名所有目录(递归)。 E.g。

改变之前:

product images/
  2010 products/
  2011 products/
  2012 products/
misc images/
nav images/

(等)

更改后:

product_images/
  2010_products/
  2011_products/
  2012_products/
misc_images/
nav_images/

感谢任何帮助。

5 个答案:

答案 0 :(得分:4)

看看fixnames。你可以这样做:

fixdirs -x \s -r _ *

在将其应用到您的真实目录之前,请务必先在不同的根目录上进行测试,这是您不必担心的问题。

答案 1 :(得分:1)

您可以使用rename命令:

rename -v 's/ /_/g' * */* */*/* */*/*/*

如果您使用Red Hat(或类似的发行版作为CentOS ...),那么rename命令就不同了:

rename -v ' ' _ * */* */*/* */*/*/*

这也将重命名文件名的空格,而不仅仅是目录。但我想这就是你想要的,不是吗?

答案 2 :(得分:1)

将Perl与File :: Find模块一起使用,您可以实现以下内容:

use File::Find;

my $dirname = "../test/";

finddepth(sub {
  return if /^\.{1,2}$/; # ignore '.' and '..'
  return unless -d $File::Find::name; # check if file is directory
  if (s/\ /_/g) {        # replace spaces in filename with underscores
    my $new_name = $File::Find::dir.'/'.$_; # new filename with path
    if (rename($File::Find::name => $new_name)) {
      printf "Directory '%s' has been renamed to '%s'\n",
             $File::Find::name,
             $new_name;
    } else {
      printf "Can't rename directory '%s' to '%s'. Error[%d]: %s\n",
             $File::Find::name,
             $new_name,
             $!, $!;
    }
  }
}, $dirname);

在:

% tree test 
test
├── test 1
├── test 2
└── test 3
    └── test 3 4

后:

% tree test 
test
├── test_1
├── test_2
└── test_3
    └── test_3_4

答案 3 :(得分:0)

我p了一下,找到了这个脚本。应该做你需要做的事情。

http://david.lutolf.net/dt/ulb/fixnames

答案 4 :(得分:0)

可以在一行中完成:

mv "product images" product_images && for i in product_images/**; do mv "$i" "${i// /_}"; done