كيف يمكنني نسخ دليل متكرر وأسماء مرشح في بيرل؟

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

سؤال

وكيف يمكنني نسخ الدليل بما في ذلك الدلائل الفرعية باستثناء الملفات أو الدلائل التي تطابق التعابير المنطقية معين على نظام Windows؟

هل كانت مفيدة؟

المحلول

وكنت تفعل شيئا من هذا القبيل:

use File::Copy;
sub copy_recursively {
    my ($from_dir, $to_dir, $regex) = @_;
    opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
    for my $entry (readdir $dh) {
        next if $entry =~ /$regex/;
        my $source = "$from_dir/$entry";
        my $destination = "$to_dir/$entry";
        if (-d $source) {
            mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
            copy_recursively($source, $destination, $regex);
        } else {
            copy($source, $destination) or die "copy failed: $!";
        }
    }
    closedir $dh;
    return;
}

نصائح أخرى

وثمة خيار آخر هو ملف :: XCOPY. كما يقول الاسم، أكثر أو أقل يحاكي الأمر XCOPY النوافذ، بما في ذلك الترشيح وخيارات متكررة.

ومن الوثائق:

    use File::Xcopy;

    my $fx = new File::Xcopy; 
    $fx->from_dir("/from/dir");
    $fx->to_dir("/to/dir");
    $fx->fn_pat('(\.pl|\.txt)$');  # files with pl & txt extensions
    $fx->param('s',1);             # search recursively to sub dirs
    $fx->param('verbose',1);       # search recursively to sub dirs
    $fx->param('log_file','/my/log/file.log');
    my ($sr, $rr) = $fx->get_stat; 
    $fx->xcopy;                    # or
    $fx->execute('copy'); 

    # the same with short name
    $fx->xcp("from_dir", "to_dir", "file_name_pattern");

إذا كنت يحدث ليكون على يونكس مثل نظام التشغيل والحصول على rsync (1)، يجب استخدام ذلك (على سبيل المثال من خلال system()).

وملف بيرل :: نسخة قليلا مكسورة (لا نسخ الأذونات على أنظمة يونكس، على سبيل المثال)، لذلك إذا كنت لا ترغب في استخدام أدوات النظام الخاص بك، والنظر في CPAN. ربما ملف :: :: نسخة العودية يمكن أن تكون ذات فائدة، ولكن أنا لا أرى أي استبعاد الخيارات. آمل شخص آخر لديه فكرة أفضل.

وأنا لا أعرف كيفية القيام استثناء مع نسخة منه، ولكن هل يمكن عمل شيء ما على غرار:

ls -R1 | grep -v <regex to exclude> | awk '{printf("cp %s /destination/path",$1)}' | /bin/sh

والجواب الكلاسيكية سوف تستخدم 'cpio -p':

(cd $SOURCE_DIR; find . -type f -print) |
perl -ne 'print unless m/<regex-goes-here>/' |
cpio -pd $TARGET_DIR

وو"cpio" صفقات الأوامر مع النسخ الفعلي، بما في ذلك الحفاظ على إذن. خدعة "cd $SOURCE_DIR; find . ..." تتعامل مع إزالة جزء بارز في مسار المصدر من الأسماء. المشكلة الوحيدة مع هذا الاحتجاج "find" هو أنه لن تتبع روابط الرمزية. تحتاج إلى إضافة '-follow "اذا كان هذا ما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top