我想通过将所有出现的空格更改为下划线来重命名所有目录(递归)。 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/
感谢任何帮助。
答案 0 :(得分:4)
答案 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)
答案 4 :(得分:0)
可以在一行中完成:
mv "product images" product_images && for i in product_images/**; do mv "$i" "${i// /_}"; done