คัดลอกไฟล์ด้วยการเปลี่ยนชื่อ


28

ฉันมีแผนผังไฟล์ขนาดใหญ่ บางไฟล์มีชื่อเดียวกัน แต่ในกรณีที่แตกต่างกันเช่นและsome_code.cSome_Code.c

ดังนั้นเมื่อฉันพยายามที่จะคัดลอกไปยังระบบไฟล์ NTFS / FAT มันถามฉันเกี่ยวกับว่าฉันต้องการแทนที่ไฟล์หรือข้ามมัน

มีวิธีใดบ้างที่จะเปลี่ยนชื่อไฟล์ดังกล่าวโดยอัตโนมัติตัวอย่างเช่นโดยการเพิ่ม (1)ชื่อไฟล์ขัดแย้ง (เช่น Windows 7)


อยากรู้อยากเห็น ฉันแค่อยากจะเห็นสิ่งที่ชนิดของข้อผิดพลาดที่ฉันได้รับถ้าฉันพยายามที่จะผลิตไฟล์ที่มีชื่อเดียวกันบน NTFS พาร์ทิชัน (HPFS / NTFS ตามsudo fdisk -l /dev/sda) และได้touch foo; touch Fooและจบลงด้วย 2 ไฟล์และfoo Fooแต่ฉันไม่อยากรู้อยากเห็นว่า enogh รีบูทเข้าสู่ Windows เพื่อดูว่าพวกเขามีลักษณะอย่างไรตรงนั้น ย้ายมันเป็นเพียงปัญหา FAT หรือไม่? อ่า - ฉันมี USB-Stick พร้อม FAT และสามารถสร้างระบบ FAT ภายในไฟล์ ... - โปรดรอสักครู่ :)
ผู้ใช้ที่ไม่รู้จัก

คำตอบ:


41

เครื่องมือมากมาย GNU เช่นcp, mvและtarสนับสนุนการสร้างไฟล์สำรองข้อมูลเมื่อเป้าหมายที่มีอยู่ นั่นคือเมื่อคัดลอกfooไปbarถ้ามีอยู่แล้วไฟล์ที่เรียกว่าbarที่มีอยู่ barจะถูกเปลี่ยนชื่อและหลังจากคัดลอกจะมีเนื้อหาของbar fooโดยค่าเริ่มต้นbarจะถูกเปลี่ยนชื่อเป็นbar~แต่พฤติกรรมสามารถแก้ไขได้:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

มีตัวแปรอื่น ๆ เช่นการสร้างการสำรองข้อมูลที่กำหนดหมายเลขเฉพาะเมื่อมีอยู่แล้ว ดูรายละเอียดเพิ่มเติมในคู่มือ coreutils


1
สุกใส ฉันไม่รู้ว่ามีตัวเลือกนี้และมันก็พิสูจน์แล้วว่ามีประโยชน์มาก ขอบคุณ @Gilles
Steve Hill

2
OSX cp ไม่มีการตั้งค่าสถานะ - แบ็คอัพ ใช้brew install coreutilsแล้วใช้คำสั่งgcpแทน
Weston Ganger

6

ฉันเหนื่อย

apropos copy | grep "(1)" 

เพื่อค้นหาผู้สมัครที่เป็นไปได้และ mcopy ปรากฏตัวขึ้น

man mcopy 

แสดงตัวเลือกที่มีแนวโน้มว่า-D clash-optionไม่เจ๋งใช่มั้ย แต่ไม่เท่ห์ - มันไม่ได้อธิบาย แต่มีคำแนะนำบางอย่างเกี่ยวกับ mtools.dvi ซึ่งฉันค้นหาในระบบของฉันไม่ประสบความสำเร็จและผ่าน google ไม่ประสบความสำเร็จ แต่ด้วย google ฉันค้นหาโดยตรงmcopy clash-optionและค้นหาไซต์นี้โดยตรง

ฉันทำแบบทดสอบสั้น ๆ

mcopy -D A f* a 

เพื่อทดสอบสำหรับชื่อผู้ใช้และ targetdir a - แทนการตั้งชื่ออัตโนมัติมันขอให้ฉันสำหรับทุกไฟล์ที่จะละเว้นหรือลบล้างโง่ที่ s ...

รุ่นของฉันคือ mtools-4.0.10และหน้าความช่วยเหลือมาจาก 1996 - 15 ปี เราควรจะสูญเสียคุณสมบัติบางอย่างจริงๆในขณะเดียวกัน?

ฉันจะแบ่งงานออกเป็นสองขั้นตอน:

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

เราจะช่วยในแนวทางนี้ได้ไหม? :)

นี่คือสคริปต์เพื่อเปลี่ยนชื่อไฟล์:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

และนี่คือการอุทธรณ์การทดสอบของฉัน:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

หมายเหตุ: -maxdepth, -name และ -type ที่ใช้เพื่อ จำกัด จำนวนไฟล์ที่ได้รับผลกระทบอย่างมาก ฉันไม่ได้ทดสอบสคริปต์สำหรับโครงสร้างไฟล์ที่ลึกกว่าหรือช่องว่างในชื่อไฟล์และอักขระอื่น ๆ ที่ขี้ขลาดเช่น linefeed, pagefeed เป็นต้น

ฉันใช้. 0.1 เพราะมันไม่ได้สร้างปัญหาในคำสั่งส่วนใหญ่ในขณะที่ (และ) มักจะต้องปิดบัง



0

ไม่ใช่กับ GNU cpอย่างน้อย

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

find . | tr A-Z a-z | sort | uniq -d

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


ผู้ชายไม่เคยบอกเป็นนัยว่าเขาเป็นคนที่สร้างความยุ่งเหยิงนั้น
tshepang

ใช่แล้วจริง แต่เขาเป็นคนที่ทุกข์ทรมานจากผลที่ตามมา☺
jmtd

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