[英]How can I add a prefix to all filenames under a directory?
我試圖在字符串( reference_
)前面添加所有目錄中的所有* .bmp文件的名稱以及子目錄。 我們第一次運行silk腳本時,它將創建目錄以及子目錄,並且在每個子目錄下,它將以.bmp
擴展名存儲每個移動應用程序的sceenshot。
當我第二次運行自動化silkscript時,它將再次在所有子目錄中創建* .bmp文件。 在第二次運行腳本之前,我想在所有* .bmp前面添加字符串reference_
。
例如first_screen.bmp
到reference_first_screen.bmp
,我的目錄結構如下:
C:\Image_Repository\BG_Images\second
...
C:\Image_Repository\BG_Images\sixth
有first_screen.bmp
和first_screen.bmp
文件等...
任何人都可以幫助我嗎?
如何使用reference_
string為所有圖像文件名添加前綴?
當我第二次運行腳本時,絲綢中的Perl腳本將從子目錄中獲取兩個圖像並逐個像素地比較它們。 我正在嘗試下面的代碼。 能否指導我如何繼續完成這項任務。
#!/usr/bin/perl -w
&one;
&two;
sub one {
use Cwd;
my $dir ="C:\\Image_Repository";
#print "$dir\n";
opendir(DIR,"+<$dir") or "die $!\n";
my @dir = readdir DIR;
#$lines=@dir;
delete $dir[-1];
print "$lines\n";
foreach my $item (@dir)
{
print "$item\n";
}
closedir DIR;
}
sub two {
use Cwd;
my $dir1 ="C:\\Image_Repository\\BG_Images";
#print "$dir1\n";
opendir(D,"+<$dir1") or "die $!\n";
my @dire = readdir D;
#$lines=@dire;
delete $dire[-1];
#print "$lines\n";
foreach my $item (@dire)
{
#print "$item\n";
$dir2="C:\\Image_Repository\\BG_Images\\$item";
print $dir2;
opendir(D1,"+<$dir2") or die " $!\n";
my @files=readdir D1;
#print "@files\n";
foreach $one (@files)
{
$one="reference_".$one;
print "$one\n";
#rename $one,Reference_.$one;
}
}
closedir DIR;
}
我嘗試使用'+ <'模式打開調用,但我收到了讀寫模式的編譯錯誤。 當我運行此代碼時,它會顯示帶有前綴字符串的BG_images文件夾中的文件,但實際上它並未更新子目錄中的文件。
您可能應該檢查File :: Find模塊 - 它將使目錄樹的上下復制變得更簡單。
您應該掃描文件名並修改那些不以reference_
開頭的文件名,以便它們可以。 這可能需要將文件名拆分為目錄名和文件名,然后使用reference_
為文件名部分添加前綴。 這是通過File :: Basename模塊完成的。
在某些時候,您需要決定第三次運行腳本時會發生什么。 已經以reference_
開頭的文件是否被覆蓋,或者是否覆蓋了未加前綴的文件,或者是什么?
未重命名文件的原因是重命名操作已注釋掉。 記得添加use strict;
在腳本的頂部(以及您使用的-w
選項)。
如果你得到一個數組@files
中的文件列表(並且名稱是基本名稱,所以你不必使用File :: Basename),那么循環可能如下所示:
foreach my $one (@files)
{
my $new = "reference_$one";
print "$one --> $new\n";
rename $one, $new or die "failed to rename $one to $new ($!)";
}
您沒有打開要寫入的目錄。 只使用沒有字符串模式部分的opendir :
opendir my($dir), $dirname or die "Could not open $dirname: $!";
但是,你不需要那樣做。 您可以使用File :: Find來創建所需的文件列表。
#!/usr/bin/perl use strict; use warnings; use File::Basename; use File::Find; use File::Find::Closures qw(find_regular_files); use File::Spec::Functions qw(catfile); my( $wanted, $reporter ) = find_regular_files; find( $wanted, $ARGV[0] ); my $prefix = 'recursive_'; foreach my $file ( $reporter->() ) { my $basename = basename( $file ); if( index( $basename, $prefix ) == 0 ) { print STDERR "$file already has '$prefix'! Skipping.\n"; next; } my $new_path = catfile( dirname( $file ), "recursive_$basename" ); unless( rename $file, $new_path ) { print STDERR "Could not rename $file: $!\n"; next; } print $file, "\n"; }
借助來自coreutils for Windows的find
實用程序:
$ find -iname "*.bmp" | perl -wlne"chomp; ($prefix, $basename) = split(m~\/([^/]+)$~, $_); rename($_, join(q(/), ($prefix, q(reference_).$basename))) or warn qq(failed to rename '$_': $!)"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.