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


11

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

  1. คัดลอกไฟล์และแทนที่ / เขียนทับไฟล์ที่มีอยู่
  2. ยกเลิกการคัดลอกไฟล์ใหม่ไปยังไดเรกทอรี
  3. คัดลอกไฟล์ แต่เปลี่ยนชื่อ (เช่นชื่อ "filename - copy (1)")

เมื่อฉันทำสิ่งนี้ใน Ubuntu ฉันไม่มีตัวเลือกที่ 3 (ซึ่งบ่อยครั้งเป็นตัวเลือกที่มีประโยชน์มาก) มีวิธีใดบ้างที่จะสามารถทำได้ใน Ubuntu

คำตอบ:


17

น่าเสียดายที่ Nautilus ไม่มีตัวเลือกนั้น

ตัวเลือก 1: ตัวจัดการไฟล์อื่น

คุณอาจจะลองจัดการไฟล์อื่นเช่นโลมา

ติดตั้ง Dolphin(ต้องมีที่เก็บข้อมูลจักรวาล )

ตัวเลือก 2: บรรทัดคำสั่ง

คุณยังสามารถใช้โปรแกรมบรรทัดคำสั่งcp(1)พร้อมตัวเลือกสำรอง:

cp --backup -t DESTINATION SOURCE [SOURCE...]

นี่คือเอฟเฟกต์ต่อไปนี้ซึ่งสามารถควบคุมได้ด้วยตัวเลือกอื่นดังที่อธิบายไว้ในหน้าคู่มือของcp(1):

--backup[=CONTROL] - ทำการสำรองข้อมูลของไฟล์ปลายทางแต่ละไฟล์ที่มีอยู่

-b- ชอบ--backupแต่ไม่ยอมรับการโต้แย้ง

-S, --suffix=SUFFIX- แทนที่คำต่อท้ายสำรองปกติ

คำต่อท้ายสำรอง~เว้นแต่กำหนดด้วยหรือ--suffix SIMPLE_BACKUP_SUFFIXวิธีการควบคุมเวอร์ชันอาจถูกเลือกผ่าน--backupตัวเลือกหรือผ่านVERSION_CONTROLตัวแปรสภาพแวดล้อม นี่คือค่า:

  • none, off: ไม่ทำการสำรองข้อมูล (แม้ว่า--backupจะได้รับ)
  • numbered, t: ทำการสำรองข้อมูลที่มีหมายเลข
  • existing, nil: กำหนดหมายเลขหากมีการสำรองข้อมูลที่มีหมายเลขเป็นอย่างอื่น
  • simple, never: ทำการสำรองข้อมูลอย่างง่ายเสมอ

ตัวอย่าง

cp --backup=existing --suffix=.orig -t ~/Videos ~/Music/*

นี้จะคัดลอกไฟล์ทั้งหมดในการ~/Music ~/Videosหากไฟล์ที่มีชื่อเดียวกันมีอยู่ที่ปลายทางไฟล์นั้นจะถูกเปลี่ยนชื่อโดยการต่อท้าย.origชื่อเป็นการสำรองข้อมูล หากไฟล์ที่มีชื่อเดียวกับการสำรองข้อมูลมีอยู่การสำรองข้อมูลจะถูกเปลี่ยนชื่อแทนโดยการต่อท้าย.1และถ้ามีอยู่เช่นกัน.2และอื่น ๆ จากนั้นเป็นไฟล์ต้นฉบับที่คัดลอกไปยังปลายทาง

หากคุณต้องการคัดลอกไฟล์ในไดเรกทอรีย่อยใช้ซ้ำ:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music

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

1
ปลาโลมาใช้งานได้ดีในเรื่องนี้ :)
24414 heisenbergman

ขอบคุณสำหรับการลองทั้งสอง ฉันจะอัปเดตคำถามตามการค้นพบของคุณ
David Foerster

@heisenbergman สวัสดีคุณหมายถึงอะไรโดย Dolphin ทำงานได้ดีสำหรับสิ่งนี้? มันเสนอตัวเลือกในการเปลี่ยนชื่อ แต่ก็ยังอนุญาตให้ฉันเปลี่ยนชื่อไฟล์ทีละหนึ่ง น่าเสียดายที่ตัวเลือก "ใช้กับทุกคน" ไม่สามารถใช้กับตัวเลือกในการเปลี่ยนชื่อ ค่อนข้างไร้ประโยชน์สำหรับไฟล์จำนวนมาก นี่เป็นเพียงรุ่นของฉันหรือไม่ คุณจัดการเปลี่ยนชื่อคู่ของคุณทั้งหมดในครั้งเดียว (เช่นเดียวกับใน Windows) โดยใช้ Dolphin หรือไม่
Kvothe

1
@ n1k31t4 โปรดอ่านคำอธิบาย--backup=existingอีกครั้ง คำแนะนำ: เกิดอะไรขึ้นในกรณีต่อไปนี้: touch foo bar; cp -v --backup=numbered foo bar; cp -v --backup=existing foo bar?
David Foerster

2

พบสิ่งนี้ใน superuser :

#!/bin/bash
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

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

find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้โปรดดูที่ลิงก์



0

คัดลอกสคริปต์นี้ไปยังไดเรกทอรีด้านบนทำให้สามารถเรียกใช้และรันได้:

#!/bin/bash

## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1

## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
    mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)

## Checking which files need to be renamed
while [[ $list != '' ]] ; do
   ##Remaming the un-moved files to unique names and move the renamed files
   find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
       current_file=$(basename $file)
       mv -n $file "./${nr}${current_file}"
   done
   ## Incrementing counter to prefix to file name
   nr=$((nr+1))
   list=$(find . -mindepth 2 -type f -print)
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.