Score:2

วิธีแบทช์เปลี่ยนชื่อหมายเลขนำหน้าตามลำดับเป็นคำนำหน้าตามลำดับใหม่ผ่านเทอร์มินัล

ธง ng

ฉันจะเปลี่ยนชื่อเป็นแบตช์โดยใช้เทอร์มินัล ซึ่งเป็นชุดของไฟล์ที่ตัวเลขหลายตัวใช้คำนำหน้าเดียวกันร่วมกัน เพื่อให้คำนำหน้าเหล่านั้นทั้งหมดถูกตั้งค่าใหม่ได้อย่างไร

ตัวอย่างเช่น:

011.foo.txt -> 001.foo.txt
011.bar.psd -> 001.bar.psd
011.baz.gif -> 001.baz.gif
012.qux.js -> 002.qux.js
012.corge.png -> 002.corge.png
...
020.thud.txt -> 010.thud.txt

ฉันต้องการใช้คำสั่งเปลี่ยนชื่อถ้าเป็นไปได้:

เปลี่ยนชื่อ [ -h|-m|-V ] [ -v ] [ -0 ] [ -n ] [ -f ] [ -d ] [ -e|-E perlexpr]*|perlexpr [ ไฟล์ ]

ขอขอบคุณจริงๆ ที่คุณช่วยหาคำตอบนี้ ขอบคุณ!

hr flag
คุณต้องการลดค่าตัวเลขของคำนำหน้าลง 10 ในแต่ละกรณีหรือไม่
user10489 avatar
in flag
ความสัมพันธ์ระหว่างหมายเลขแหล่งที่มาและเป้าหมายของคุณไม่ชัดเจน การเรียกใช้คำสั่งเปลี่ยนชื่อเพียงครั้งเดียวจะไม่สามารถจัดการที่ซับซ้อนเช่นนี้ได้ วิธีการที่ปลอดภัยสำหรับสิ่งนี้คือการสร้างไฟล์ (โดยใช้ awk? perl?) ด้วยคำสั่ง mv หลายคำสั่ง และตรวจสอบผลลัพธ์และแก้ไขปัญหาใดๆ และเรียกใช้ไฟล์
io4250 avatar
ng flag
@steeldriver นั่นเป็นทางออกที่น่าสนใจที่ฉันไม่เคยนึกถึง แต่โดยหลักการแล้วฉันต้องการให้ไฟล์ที่เปลี่ยนชื่อเริ่มต้นที่จุดใดจุดหนึ่ง (เช่น 001 หรือ 005) โดยไม่ต้องคำนวณทางคณิตศาสตร์ถ้าเป็นไปได้ เพื่อที่ฉันจะได้ใช้โซลูชันเดียวกันโดยไม่คำนึงถึงหมายเลขเริ่มต้นในรายการไฟล์ปัจจุบัน
io4250 avatar
ng flag
@user10489 ขออภัย ฉันพิมพ์ผิดในตัวอย่างของฉันและได้อัปเดตแล้ว (ก่อนหน้านี้ 010.thud.txt ชื่อ 003.thud.txt ไม่ถูกต้อง)
Score:2
ธง hr

หากคุณต้องการให้ไฟล์ที่มีคำนำหน้าเดิมตรงกันเพื่อแมปกับคำนำหน้าเดียวกันในโครงร่างใหม่ ปราศจาก อาศัยการลบ จากนั้นคุณสามารถทำได้โดยสร้างแฮช (อาร์เรย์ที่เชื่อมโยง) ของคำนำหน้า กำหนดหมายเลขเหล่านั้นตามลำดับ จากนั้นทำการแทนที่การเปลี่ยนชื่อด้วยการค้นหาในแฮช อดีต.

$ เปลี่ยนชื่อ -n -E '
  เริ่ม {
    $n ของฉัน = 1;
    %pfxs ของเรา;
    foreach ของฉัน $f (@ARGV) {
      $pfxs{$1} = (มีอยู่ $pfxs{$1} ? $pfxs{$1} : $n++) ถ้า $f =~ /^(\d{3})/
    }
  }
  %pfxs ของเรา;
  s/^(\d{3})/sprintf "%03d", $pfxs{$1}/e
' [0-9][0-9][0-9].*
เปลี่ยนชื่อ (011.bar.psd, 001.bar.psd)
เปลี่ยนชื่อ (011.baz.gif, 001.baz.gif)
เปลี่ยนชื่อ (011.foo.txt, 001.foo.txt)
เปลี่ยนชื่อ (012.corge.png, 002.corge.png)
เปลี่ยนชื่อ (012.qux.js, 002.qux.js)
เปลี่ยนชื่อ (020.thud.txt, 003.thud.txt)

เนื่องจากไม่ต้องอาศัยการลบ จึงสามารถใช้วิธีนี้ได้แม้ว่าคำนำหน้าเดิมจะไม่ใช่ตัวเลขก็ตาม

สิ่งนี้สามารถปรับปรุงได้โดยไม่ต้องสงสัย - โดยเฉพาะอย่างยิ่ง เราสามารถตรวจสอบค่าสูงสุดของ $n ที่ส่วนท้ายของการแมป และเลือกความกว้างของเอาต์พุตตามนั้น

io4250 avatar
ng flag
ขอโทษ @steeldriver ฉันพิมพ์ผิดตอนพิมพ์ 003.thud.txt จริงๆ แล้วฉันตั้งใจจะพิมพ์ 010.thud.txt
hr flag
@ io4250 tbh ฉันคิดว่ามันไม่สำคัญเพราะเราไม่มีส่วน `...` ของลำดับ
Score:2
ธง cn

การใช้ Perl เปลี่ยนชื่อ ตามที่ขอ.

สำหรับสิ่งที่คำถามของคุณแสดงให้เห็น:

เปลี่ยนชื่อ -n 's/^(\d+)/sprintf "%03d", $1-10/e' *

เอาต์พุตแบบแห้ง:

เปลี่ยนชื่อ (011.bar.psd, 001.bar.psd)
เปลี่ยนชื่อ (011.baz.gif, 001.baz.gif)
เปลี่ยนชื่อ (011.foo.txt, 001.foo.txt)
เปลี่ยนชื่อ (012.corge.png, 002.corge.png)
เปลี่ยนชื่อ (012.qux.js, 002.qux.js)
เปลี่ยนชื่อ (020.thud.txt, 010.thud.txt)

สำหรับชื่อคำถามที่มีคำนำหน้าตามลำดับจริง:

เปลี่ยนชื่อ -n -E 'ใช้ vars q{$n}' -e 's/^(\d+)/sprintf "%03d", ++$n/e' *
เปลี่ยนชื่อ (011.bar.psd, 001.bar.psd)
เปลี่ยนชื่อ (011.baz.gif, 002.baz.gif)
เปลี่ยนชื่อ (011.foo.txt, 003.foo.txt)
เปลี่ยนชื่อ (012.corge.png, 004.corge.png)
เปลี่ยนชื่อ (012.qux.js, 005.qux.js)
เปลี่ยนชื่อ (020.thud.txt, 006.thud.txt)

สำหรับอันแรก หากคุณไม่ต้องการฮาร์ดโค้ดเดลต้า 10:

เปลี่ยนชื่อ -n -E 'ใช้ vars q{$delta}' -e '
    ส{^(\d+)}{
        $delta = $1 - 1 เว้นแต่จะกำหนด $delta;
        sprintf "%03d", $1 - $เดลต้า
    }จ
' *
Score:1
ธง jp

ในการทุบตี

ลองสิ่งนี้ (เรียกใช้แบบแห้ง) จากภายในไดเร็กทอรีที่มีไฟล์:

สำหรับ f ใน *
ทำ
    r="${f#*.}"
    p="${f%%.*}"
    ถ้า [ "$p" -eq "$p" ] 2>/dev/null
    แล้ว  
    p="$((10#$p - 10))"
    p="$(พิมพ์f "%03d" $p)"
    echo mv -- "$f" "$p.$r"
    ไฟ 
เสร็จแล้ว

หากคุณพอใจกับผลงานที่พิมพ์ออกมา ให้เปลี่ยนบรรทัด:

echo mv -- "$f" "$p.$r"

ถึง:

mv -- "$f" "$p.$r"

การถอด เสียงสะท้อน เพื่อทำการเปลี่ยนชื่อจริง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา