كيف يمكنني إضافة بادئة لجميع أسماء الملفات تحت دليل؟
-
03-07-2019 - |
سؤال
واني اسعى الى بادئة سلسلة (reference_
) إلى أسماء جميع *. BMP الملفات في كافة الدلائل وكذلك الدلائل الفرعية. المرة الأولى التي نقوم بتشغيل البرنامج النصي الحرير، فإنه سيتم إنشاء الدلائل كما الدلائل جيدا، وتحت كل دليل فرعي فإنه سيتم تخزين sceenshot كل تطبيقات الهاتف المتحرك مع تمديد .bmp
.
وعند تشغيل 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_
؟
وعند تشغيل البرنامج النصي للمرة الثانية، والسيناريو بيرل في الحرير سوف تتخذ كل من الصور من دليل فرعي ومقارنتها على حد سواء بكسل بكسل. أحاول مع رمز أدناه. فأرجو أن توجه لي كيف يمكنني المضي قدما لإكمال هذه المهمة.
#!/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 مع سلسلة مسبوقة ولكن في الواقع انها ليست تحديث الملفات في الدلائل الفرعية.
المحلول
وأنت لا تفتح دليل للكتابة. مجرد استخدام opendir دون الأجزاء وضع السلسلة:
opendir my($dir), $dirname or die "Could not open $dirname: $!";
ومع ذلك، لا تحتاج ذلك. يمكنك استخدام ملف :: البحث لجعل قائمة الملفات التي تحتاج إليها.
#!/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"; }
نصائح أخرى
وربما يجب عليك التحقق من :: البحث وحدة لهذا - سيجعل recursing صعودا وهبوطا شجرة الدليل أبسط.
وأنت ربما ينبغي مسح أسماء الملفات وتعديل تلك التي لا تبدأ مع reference_
بحيث يقومون به. قد تتطلب تقسيم اسم الملف يصل الى اسم الدليل واسم الملف ثم التقديم الجزء اسم الملف مع reference_
. أن يتم ذلك مع :: Basename حدة.
وعند نقطة ما، عليك أن تقرر ما يحدث عند تشغيل البرنامج النصي مرة الثالثة. هل الملفات التي تبدأ بالفعل مع reference_
الحصول على الكتابة، أو القيام الملفات غير المسبوقة ببادئة الحصول على الكتابة، أم ماذا؟
والسبب لا يتم إعادة تسمية الملفات هو أن عملية إعادة تسمية وعلق بها. تذكر أن تضيف use strict;
في الجزء العلوي من السيناريو الخاص بك (وكذلك الخيار -w
التي فعلت الاستخدام).
إذا تحصل على قائمة الملفات في @files
مجموعة (وأسماء هي أسماء الأساس، لذلك لم يكن لديك لعزف مع ملف :: Basename)، ثم حلقة قد تبدو:
foreach my $one (@files)
{
my $new = "reference_$one";
print "$one --> $new\n";
rename $one, $new or die "failed to rename $one to $new ($!)";
}
ومع المعونة من فائدة find
من coreutils ويندوز :
$ find -iname "*.bmp" | perl -wlne"chomp; ($prefix, $basename) = split(m~\/([^/]+)$~, $_); rename($_, join(q(/), ($prefix, q(reference_).$basename))) or warn qq(failed to rename '$_': $!)"