[英]Perl: Recursively rename all files and directories
我需要遞歸重命名每個文件和目錄。 我將空格轉換為下划線,並將所有文件/目錄名稱設置為小寫。 如何使以下腳本在一次運行中重命名所有文件? 目前,在轉換所有文件/目錄之前,需要多次運行腳本。 代碼如下:
#!/usr/bin/perl
use File::Find;
$input_file_dir = $ARGV[0];
sub process_file {
$clean_name=lc($_);
$clean_name=~s/\s/_/g;
rename($_,$clean_name);
print "file/dir name: $clean_name\n";
}
find(\&process_file, $input_file_dir);
您需要在傳遞的選項中指定bydepth => 1
來查找或調用finddepth
。 來自perldoc文件::查找 :
bydepth
僅在報告所有條目后報告目錄的名稱。 入口點
finddepth()
是在find()
的第一個參數中指定{ bydepth => 1 }
的快捷方式。
但是, 您仍然需要決定如何處理命名沖突,因為如果目標存在,重命名將破壞目標 。
#!/usr/bin/perl
use strict; use warnings;
use File::Find;
finddepth(\&process_file, $_) for @ARGV;
如果您對其他方法持開放態度,那么這是一個Python解決方案
import os
for R,DIR,FILES in os.walk("/mypath",topdown=False):
for file in FILES:
newfile=file.lower().replace(" ","_")
new_file_name=os.path.join(R,newfile)
os.rename( os.path.join(R,file) , new_file_name)
for dir in DIR:
newdir=dir.lower().replace(" ","_")
new_dir_name=os.path.join(R,newdir)
os.rename( os.path.join(R,dir) , new_dir_name)
您可以在遍歷目錄之前重命名文件。
find({
preprocess => sub {
for (@_) {
my $oldname = $_;
$_ = lc;
s/\s/_/g;
rename $oldname => $_;
}
return @_;
},
wanted => sub {
print "$File::Find::name was already renamed\n";
},
},
@dirs
);
或者您可以延遲重命名,直到遍歷發生。
finddepth(sub {
print "in $File::Find::dir, renaming $_\n";
my $newname = lc;
$newname =~ s/\s/_/g;
rename $_ => $newname;
},
@dirs
);
你遇到的問題是因為
find
目錄"Abc Def"
find
wanted("Abc Def")
電話wanted("Abc Def")
rename "Abc Def" => "abc_def"
find
嘗試輸入"Abc Def"
,它不再存在
所以下面的一切都沒有得到處理
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.