ไฟล์แบทช์เปลี่ยนชื่อสคริปต์การแลกเปลี่ยนสตริงย่อยในชื่อไฟล์?


1

ฉันมีกลุ่มไฟล์ชื่อเช่นtitle_december_word1_word2.pngและต้องการวนซ้ำผ่านไดเรกทอรีและสลับword1และword2ภายในแต่ละไฟล์

เช่นไปจากbutton_december_state_pressed.png->button_december_pressed_state.png

มีข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันจะทำสิ่งนี้ให้สำเร็จ

โปรแกรมแบทช์ส่วนใหญ่ที่ฉันพบสำหรับ OS X ไม่สามารถระบุตัวอักษรเพื่อแยกคำและฉันหวังว่าจะมีคนช่วยฉันด้วยสคริปต์อย่างรวดเร็วเพื่อแก้ปัญหานี้

คำตอบ:


1

ใน bash สามารถทำได้ดังนี้:

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

คำสั่งนี้ค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันก่อนจากนั้นจึงป้อนชื่อเหล่านี้ ( โดยไม่มีการตรวจสอบว่ามีขีดล่างสามอันและ. ในชื่อไฟล์เหล่านี้) เป็น awk ซึ่งจัดเรียงใหม่ตามลำดับที่คุณต้องการ

ส่วนที่ยุ่งยากเท่านั้นคือ-F'[_.]'ตัวเลือก-F' 'ใช้เพื่อระบุตัวคั่นระหว่างเขตข้อมูลที่แตกต่างกันและในกรณีนี้ตัวคั่นจะใช้ค่าเริ่มต้นคือช่องว่าง แต่ตัวเลือกจะ-F'[_.]'กำหนดคลาสอักขระขององค์ประกอบที่เปลี่ยนแปลงได้ในกรณีนี้ขีดล่างและจุดซึ่งสามารถใช้ที่จะเป็นตัวคั่น

แก้ไข:

ตกลงเนื่องจากงานนี้โดยไม่ย้ายอะไรเลยตอนนี้เราสามารถใช้การกระทำที่แท้จริงของการเปลี่ยนชื่อไฟล์:

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

ใช้งานได้ แต่ฉันจะนำการเปลี่ยนแปลงเหล่านั้นไปใช้กับชื่อไฟล์จริงได้อย่างไร
user1911904

ตกลง. ตอนนี้ดูการแก้ไขของฉัน
MariusMatutiae

มันพิมพ์ในหน้าต่างเทอร์มินัลและสคริปต์อยู่ในไดเรกทอรีเดียวกับไฟล์ แต่มันก็แค่พิมพ์การแก้ไข แต่ไฟล์เองยังไม่ได้รับการแก้ไขด้วยชื่อใหม่
user1911904

จะไม่ 'เปลี่ยนชื่อ' จะต้องใช้เพื่อเปลี่ยนชื่อไฟล์ไม่ใช่แค่พิมพ์หรือ
user1911904

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

2

Zsh และ zmv

หากคุณมี zsh (ซึ่งมาเป็นค่าเริ่มต้นใน OS X) คุณสามารถใช้zmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

จะเรียกใช้คำสั่งต่อไปนี้ (ใช้zmv -nในการทำแห้งโดยไม่ต้องเปลี่ยนชื่อจริง):

mv -- title_december_word1_word2.png title_december_word2_word1.png

เห็นได้ชัดว่าคุณสามารถยืดหยุ่นได้มากกว่านี้หากส่วนแรกแตกต่างกันตามภาพ:

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

วิธีนี้ใช้งานได้เนื่องจากการแข่งขันมีความโลภและจึงกลืนขีดล่างทั้งหมดจนถึงการแข่งขันสุดท้ายก่อนการแข่งขันกลุ่มอื่น


Perl สไตล์ rename

ใน OS X คุณสามารถrenameใช้Homebrew ได้ :

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

-nตัวเลือกเพียงพิมพ์สิ่งที่จะได้รับการเปลี่ยนชื่อ

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