Bir metin dosyasındaki verileri kullanarak dosya adlarını temizleme


2

Bir sürü klasör dosya ismini temizlemeliyim. Muhtemelen dosya bile başlıkları. Şu anda kullanıyordum Bunu yapmak için bu Perl betiği ama bazı problemlerle karşılaştım.

  1. Dosya adında yıl boyunca zaten parantez varsa, başka bir kümeye ekler.
  2. Aynı zamanda başlıklarda ortak "imzaları" kaldırmak için de bir metin dosyası kullanmak istiyorum. This.Movie.Blah.(2012) [1080p] MP4.

    Şu anda sahip olduğum betiğin yerini . amaçlandığı ve eklediği bir boşlukla (xxxx) yıl civarında. Senaryoyu çalıştırmanın sonucu olur This Movie Blah ((2012)) [1080p] MP4.

Ayrıca dosya adından bir metin dosyası değeriyle eşleşen (imzalanmış, CSV değil) "imzaları" kaldırmak istiyorum. This.Movie.Blah.(2012) [1080p] MP4 dönecekti This Movie Blah (2012)

use warnings;
use strict;
use File::Copy;

my $oldname;

opendir(my $d, ".") or die $!;
while(readdir $d) {
    if (-d $_ and $_ ne "." and $_ ne "..")
    {
        $oldname = $_;
        $_ =~ s/\./ /g;
        $_ =~ s/(\d{4})/($1)/g;
        move($oldname,$_);
    }
    }
closedir $d;

Bugün Perl'i ilk programlama dillerimden biri olarak öğrenmeye başlamıştım, bu yüzden bu dilde nispeten yeniyim.

Yanıtlar:


0

Düzenli ifadeler meselesi olarak (modeller için metin aramak ve bunlara dayanarak değişiklik yapmak), bu zor değil; 15 saat sonra cevap alamamasına şaşırdım. Perl'de olmak istediğim kadar deneyimli değilim, ancak parantez içindeki yıl sorununa basit bir yaklaşım, daha sonra tespit edip düzeltmek için:

        $_ =~ s/(\d{4})/($1)/g;
        $_ =~ s/(\((\d{4})\))/$1/g;

İkinci ifade arar ((2012)) ve orta altı karakteri döndürür; yani, (2012). “Ortak imza” olarak, nasıl

        $_ =~ s/ \[1080p\] MP4$//;

? (Kullanım \[ ve \] önlemek […] aralık olarak yorumlanmasından ve $ dize sonuna bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.