كيف يمكنني إضافة بادئة لجميع أسماء الملفات تحت دليل؟

StackOverflow https://stackoverflow.com/questions/406396

  •  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 '$_': $!)"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top