mv เปลี่ยนชื่อถ้ามีอยู่


26

ฉันต้องการรวบรวมภาพจำนวนมากไว้ในไดเรกทอรีเดียว ภาพเหล่านั้นหลายภาพมีชื่อไฟล์เหมือนกัน

มีรุ่นที่ปลอดภัยmvที่จะเปลี่ยนชื่อไฟล์โดยอัตโนมัติถ้าชื่อไฟล์เป้าหมายมีอยู่แล้วเพื่อที่pic1.jpegจะกลายเป็นเช่นนั้นpic1_2.jpeg?

ฉันสามารถเขียนสคริปต์ไพ ธ อนของตัวเองได้ แต่ต้องมีบางอย่างเช่นนี้เพื่อฉันจะได้:

find . -type f -name *.jpg -exec mvsafe '{}' /targetpath/ \;

คำตอบ:


38

mv รองรับสิ่งนี้นอกกรอบอยู่แล้ว (อย่างน้อยก็ใน Debian):

mv --backup=t <source_file> <dest_file>

เท่าที่เห็นใน mv (1) manpage:

--backup[=CONTROL]
         make a backup of each existing destination file

The  backup  suffix  is  `~',  unless  set  with   --suffix   or   SIM‐
PLE_BACKUP_SUFFIX.   The version control method may be selected via the
--backup option or through the  VERSION_CONTROL  environment  variable.

ในการทำให้--backup=tค่าเฉลี่ย "สร้างการสำรองข้อมูลเป็นตัวเลข" ให้เรียกใช้ดังนี้:

env VERSION_CONTROL=numbered mv --backup=t <source_file> <dest_file>

(แน่นอน dest_file สามารถเป็นไดเรกทอรี)

แก้ไข: ในรุ่นที่ใหม่กว่า (อย่างน้อย GNU coreutils 8.22 แต่ก่อนหน้านี้แล้ว) คุณสามารถเขียนได้

mv --backup=numbered <source_file> <dest_file>

1
+1 สำหรับโซลูชันที่สะอาดน่าอัศจรรย์ BTW ตัวเลือกที่มีอยู่ใน RHEL 6 เช่นกัน
Paweł Brodacki

ในขณะที่ฟังก์ชันการทำงานที่ดีสิ่งนี้ไม่ได้ช่วยอะไรมากในกรณีของฉันเพราะมันจะผนวกส่วนต่อท้ายหลังจากส่วนขยายดังนั้นไฟล์จะจบลงด้วยชื่อเช่น. jpg ~ 1 ~ ในขณะที่ฉันต้องการให้ชื่อ _1.jpg ฉันอาจจะใช้ mmv เพื่อเปลี่ยนชื่อไฟล์หลังจากย้ายพวกเขา
theduke

4
นี้เป็นคำสั่ง MMV ที่จะบรรลุผลที่ต้องการของฉันหลังจากทำ mv --backup = หมายเลข: MMV -v " "# 1_ # 3 # 2" ~ * ~."
theduke

ในระบบ Debian ของฉัน (1.01b-18 MMV) คำสั่งที่ถูกต้องคือ MMV:mmv -v "*.*~*~" "#1_#3.#2"
ซาเวียร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.