การเปลี่ยนชื่อไฟล์ด้วยโครงสร้างพิเศษในวิธีที่รวดเร็ว


0

ฉันเช็คเอาท์วิธีแก้ปัญหาที่นี่แต่มันก็ไม่ได้แก้ปัญหาของฉันได้ดีเพราะมันไม่ได้ใช้โครงสร้างเฉพาะของการตั้งชื่อของฉัน

ฉันมีคอลเลกชันของไฟล์ที่ระบุและตั้งชื่ออย่างเป็นระบบเช่น

Filep-X

โดยที่ x คือตัวเลขที่ค่อนข้างใหญ่และ p เป็นเครื่องหมายสำหรับ "makrocollection" ฉันต้องการคัดลอกไฟล์ทั้งหมดในรูปแบบ makrocollection เป็นแม่แบบและเปลี่ยนชื่อไฟล์ทั้งหมดที่คัดลอกมาโดยอัตโนมัติ

fileq-X

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

ขอบคุณล่วงหน้า!

คำตอบ:


2

นี่อาจเป็นงานให้paxโดยสมมติว่ามีหลักการตั้งชื่อที่สอดคล้องกัน

cd directory

pax -rws/filep/fileq/ filep-* /path/to/copy/directory

1

โดยปกติสิ่งนี้สามารถทำได้ด้วยการbashวนซ้ำ - ไม่ใช่แบบเร็วที่สุด แต่แบบง่าย ในประเภทอาคาร:

for f in filep-* ; do mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

คำอธิบาย:

  • for f in filep-* ; do -> สำหรับไฟล์ทั้งหมดที่เรียกว่าfilep-anythingทำต่อไปนี้
  • mv -iv A Bย้าย (= เปลี่ยนชื่อ) A ไป B ในขณะที่บอกสิ่งที่คุณทำ-vและขอการยืนยันก่อนที่จะเขียนทับไฟล์ที่มีอยู่-i
  • กำลังจะย้ายไฟล์"$f"(คำพูดสำหรับการแก้ปัญหาเช่นช่องว่างในชื่อไฟล์) ไปที่:
  • $( $echo $f | sed 's/A/B' )พิมพ์ชื่อไฟล์จากนั้นใช้sedเพื่อsแทนที่การเกิดขึ้นครั้งแรกของ (! และก่อนเท่านั้น) ของAด้วยB(ซึ่งอาจเป็นได้sed 's/this123/that456/'แต่โปรดทราบว่ามันจะตรงกับการเข้าชมครั้งแรก)

เพื่อให้แน่ใจว่ามันทำงานตามที่คาดไว้ให้เรียกใช้สิ่งนี้ก่อน:

for f in filep-* ; do echo mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

นี่จะพิมพ์คำสั่งที่จะดำเนินการสำหรับแต่ละไฟล์และควรมีลักษณะmv -i filep-x fileq-xดังนี้

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


ฉันสมมติว่าคุณไม่ได้ทดสอบรหัสของคุณเพราะfor ... in ... doneคำสั่งตามที่เขียนไม่สามารถดำเนินการได้อย่างถูกต้องตามที่คุณอ้างถึง"$file"แต่ไม่ได้กำหนด! มันควรจะเป็นไม่ได้"$f" "$file"นอกจากนี้คุณกำลังพยายามที่จะย้ายไฟล์ที่ไม่อยู่เพราะควรจะเป็นfor f in fileq-* for f in filep-*ไฟล์ที่มีอยู่pไม่ได้อยู่qก่อนหน้า-ใน OP และควรจะqเป็นส่วนหนึ่งของการเปลี่ยนชื่อ หากฉันผิดเกี่ยวกับสิ่งนั้นsedคำสั่งของคุณจะผิด
user3439894

@ user3439894 - ขอบคุณสำหรับการแก้ไข ฉันไม่ทดสอบโค้ด แต่ใช้ตัวแปรที่แตกต่างกันดังนั้นการปะปนระหว่างfileq-และfilep-รวมถึงระหว่าง$fileและ$f(สิ่งนี้เกิดขึ้นกับฉันในครึ่งหนึ่งของbashสคริปต์ของฉัน... นิสัยที่ไม่ดี) - อัปเดต
Fiximan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.