ทำความสะอาดชื่อไฟล์โดยใช้ข้อมูลจากไฟล์ข้อความ


2

ฉันต้องล้างชื่อไฟล์โฟลเดอร์หลาย ๆ ไฟล์ อาจเป็นไปได้ว่าชื่อไฟล์เช่นกัน ฉันกำลังใช้สคริปต์ Perl นี้เพื่อทำเช่นนั้น แต่ฉันพบปัญหาบางอย่าง

  1. หากชื่อไฟล์มีวงเล็บอยู่แล้วในรอบปีก็จะเพิ่มอีกชุดหนึ่ง
  2. ฉันต้องการใช้ไฟล์ข้อความเพื่อลบ "ลายเซ็น" ทั่วไปในชื่อด้วยเช่นกัน This.Movie.Blah.(2012) [1080p] MP4.

    ขณะนี้สคริปต์ที่ฉันได้แทนที่.ด้วยช่องว่างตามที่ตั้งใจไว้และเพิ่ม(xxxx)รอบปี This Movie Blah ((2012)) [1080p] MP4ใช้สคริปต์ผลจะ

นอกจากนี้ฉันต้องการลบ "ลายเซ็น" ที่ตรงกับค่าของไฟล์ข้อความ (เรียงกัน, ไม่ใช่ CSV) จากชื่อไฟล์ดังนั้นThis.Movie.Blah.(2012) [1080p] MP4จะกลับมา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;

ฉันเพิ่งเริ่มพยายามเรียนรู้ Perl วันนี้เป็นหนึ่งในภาษาการเขียนโปรแกรมแรกของฉันดังนั้นฉันค่อนข้างใหม่กับภาษานี้

คำตอบ:


0

เป็นคำถามของนิพจน์ทั่วไป (การค้นหาข้อความเพื่อหารูปแบบและทำการแทนที่ตามพวกเขา) สิ่งนี้ไม่ยาก ฉันประหลาดใจที่ไม่มีคำตอบหลังจาก 15 ชั่วโมง ฉันไม่ได้มีประสบการณ์เกี่ยวกับ Perl อย่างที่ฉันต้องการ แต่วิธีที่ตรงไปตรงมากับปัญหาในวงเล็บคือการตรวจสอบมันในภายหลังและแก้ไขมันแล้ว:

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

คำสั่งที่สองค้นหา((2012))และส่งคืนอักขระกลางหกตัว เช่น(2012). ในฐานะที่เป็น "ลายเซ็นทั่วไป" วิธีการเกี่ยวกับ

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

? (ใช้\[และ\]เพื่อป้องกันไม่ให้[…]ถูกตีความว่าเป็นช่วงและ$เพื่ออ้างอิงถึงจุดสิ้นสุดของสตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.