ลบ 1 จากชื่อไฟล์ทั้งหมด (เปลี่ยนชื่อ) ในไดเรกทอรี


17

ฉันมีไดเรกทอรีซึ่งมีไฟล์รูปภาพที่มีชื่อเช่น

image1.jpg 
image2.jpg 
image3.jpg
...

น่าเสียดายที่ชื่อภาพจะต้องเป็นศูนย์ดังนั้นimage1.jpgควรเป็นimage0.jpgเช่นimage2.jpgนั้นควรเป็นimage1.jpgเช่นนั้น

ฉันสามารถเขียนสคริปต์เพื่อสร้างคำสั่ง mv เช่นนี้วางไว้ในเชลล์สคริปต์แล้วดำเนินการ -

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

แต่ฉันคิดว่ามันมีทางเลือกที่น่าสนใจที่จะทำใน Unix แล้วมันคืออะไร


6
นั่นเป็นวิธีที่ง่ายที่สุดที่จะทำตราบใดที่ไม่มีช่องว่าง ( for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done)
Ricky Beam

5
ลำดับของภาพสำคัญหรือไม่? หากไม่ใช่เพียงแค่เปลี่ยนชื่อภาพสุดท้ายจากimageN.jpgเป็นimage0.jpgและคุณเสร็จสิ้น
jnovacho

@jnovacho ค่อนข้างฉลาด! แต่ใช่ลำดับของภาพมีความสำคัญ
Wes

คำตอบ:


20

การเปลี่ยนชื่อ Perl ที่ดีแบบเก่า:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[หมายเหตุ]

หมายเลขรูปภาพควรมากกว่า 0

ในกรณีที่รูปภาพมากกว่า 9 และไม่มีการนำหน้า 0 ให้ใช้$(ls -v1 *)เพื่อหลีกเลี่ยงการอุดตัน เสนอโดย @arielf และสังเกตโดย @Graeme

เมื่อมีข้อสงสัยให้ใช้-vสำหรับ verbose และ-nไม่มีการดำเนินการ


"e" หมายถึงอะไร
Wes

3
'e' หมายถึงการประเมินส่วนแทนที่จะได้รับการประเมิน ดูเพิ่มเติมperlreref

6
ควรส่งไฟล์ตามลำดับจากน้อยไปหามากเพื่อหลีกเลี่ยงการถูกบล็อก สิ่งนี้จะทำงานได้ดีถ้ามีไฟล์น้อยกว่า 10 ไฟล์ (หรือถ้าตัวเลขมีศูนย์นำหน้า)
แกรม

ฉันสังเกตเห็นสิ่งนี้อยู่แล้วและจะต้องไม่มี0แหล่งที่มา

2
แทนที่*ท้ายด้วย`ls -v1 *`และคุณจะปลอดภัยจากการอุดตัน มันจะเปลี่ยนจากตัวเลขต่ำสุดไปหาสูงสุด
arielf

6

คุณสามารถไพพ์mvคำสั่งที่สร้างขึ้นbashได้ ดังนั้นคุณไม่จำเป็นต้องคัดลอกในสคริปต์และดำเนินการนั้น ดู:

command_that_generates_mv_commands | bash

bashและทุกอย่างจะต้องถูกประหารชีวิตที่ประปา


นั่นไม่ได้เป็น neater :)แก้ปัญหาอย่างไร +1 ดังนั้น
JMCF125

5

คุณสามารถวนซ้ำในเอาต์พุต ls อันนี้ใช้ได้กับตัวอย่างของคุณ:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

คุณต้องอยู่บนเส้นทางเดียวกันกับไฟล์ของคุณ


1
ดีกว่าที่จะใช้-iหรือ-nกับmvมันจะป้องกันการเขียนทับในกรณีขอบ
แกรม

จะไม่sort -Vดีกว่าแทนใช่ไหม
user80551

sortจะไม่ทำงานมันจะแสดงimage10.jpgก่อนimage1.jpgที่อาจมีปัญหา คุณต้องการsort -nk 1.8คำตอบของ @ Graeme
terdon

@ user80551 sort -Vเป็นความคิดที่ดีจะเพิ่มไปยังคำตอบของฉัน อาจมีกรณีขอบอื่น ๆ โดยทั่วไปเพียงแค่คำแนะนำที่ดีในการเพิ่มตัวเลือกประเภทนี้ด้วยคำถามเช่นนี้ในกรณีที่มีคนคัดลอกและลงเอยด้วยการทำความเสียหาย
แกรม

4

imageNUMBER.jpgต่อไปนี้ดูเหมือนว่าจะทำงานอะไรที่เหมาะกับรูปแบบ ฉันได้วางไว้ข้างechoหน้าmvคำสั่งเพื่อแสดงสิ่งที่คำสั่งจะทำก่อน เพื่อทำการเปลี่ยนชื่อจริงเพียงแค่ลบecho

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

ในบรรทัดแรกรายการls image*.jpg|sort -Vจะทำให้ไฟล์ JPG แสดงรายการด้วยตัวเลขจากน้อยไปมากในชื่อไฟล์ x=บรรทัดสารสกัดจากตัวเลขจากชื่อไฟล์ y=บรรทัดแล้ว decrements จำนวนหนึ่ง ชื่อไฟล์อินพุตและyหมายเลขจะถูกใช้ในmvคำสั่งโดยที่-iแฟล็กจะแจ้งให้คุณทราบก่อนเขียนทับไฟล์

สำหรับการทดสอบขนาดเล็กของฉันสิ่งนี้สร้างผลลัพธ์:

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

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


1
ดีกว่าที่จะใช้-iหรือ-nกับmvมันจะป้องกันการเขียนทับในกรณีขอบ
แกรม

คำแนะนำที่ดีมากฉันจะแก้ไขคำตอบ
brm

ใน MacOS คุณควรใช้sort -nการ-Vกวนที่มีอยู่ตัวเลือก
Vincent Sit

4

การใช้perlสคริปต์prenameซึ่ง symlinked เพื่อเปลี่ยนชื่อบน Distros ที่ใช้ Debian ก็ต้องการ GNU find/ sortด้วยเช่นกัน ไฟล์ถูกเรียงลำดับจากน้อยไปหามากเพื่อป้องกันการเขียนทับใด ๆ

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

ลบ-nทันทีที่คุณแน่ใจว่าทำในสิ่งที่คุณต้องการ จะเตือนเกี่ยวกับไฟล์ที่มีอยู่แล้วก่อนที่จะทำเช่นนั้น อย่างไรก็ตามตราบใดที่มันแสดงไฟล์ที่ถูกเปลี่ยนชื่อตามลำดับจากน้อยไปมากจะไม่มีข้อขัดแย้งเมื่อทำงานจริง


ไฟล์มีปัญหากับไฟล์นี้แล้ว
Wes

4

ด้วยzsh:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

(ลบ-nเมื่อมีความสุข)

(n)คือการจัดเรียงรายการตัวเลขเพื่อให้มีการเปลี่ยนชื่อก่อนimage9.jpgimage10.jpg

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