Làm cách nào tôi có thể sao chép các tệp có tên tệp trùng lặp vào một thư mục và giữ lại cả hai tệp bằng cách tự động đổi tên (các) bản sao?


11

Trên hệ điều hành windows, khi bạn sao chép một tệp vào một thư mục đã có một tệp có tên đó, nó sẽ hỏi bạn có muốn không:

  1. sao chép tập tin và thay thế / ghi đè lên tập tin hiện có
  2. hủy sao chép tập tin mới vào thư mục
  3. sao chép tệp, nhưng đổi tên nó (như một tên như "tên tệp - sao chép (1)")

Khi tôi làm điều này trong Ubuntu, tôi không có tùy chọn thứ 3 đó (rất nhiều lần là một tùy chọn rất hữu ích). Có cách nào để có thể làm điều đó trong Ubuntu không?

Câu trả lời:


17

Thật không may, Nautilus không có lựa chọn đó.

Tùy chọn 1: Trình quản lý tệp khác

Bạn có thể thử một trình quản lý tệp khác như Cá heo .

Cài đặt cá heo(yêu cầu kho vũ trụ )

Tùy chọn 2: Dòng lệnh

Bạn cũng có thể sử dụng chương trình dòng lệnh cp(1)với tùy chọn sao lưu:

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

Điều này có các hiệu ứng sau có thể được kiểm soát bằng các tùy chọn khác như được mô tả trong trang thủ công của cp(1):

--backup[=CONTROL] - tạo bản sao lưu của mỗi tệp đích hiện có

-b- thích --backupnhưng không chấp nhận một đối số

-S, --suffix=SUFFIX- ghi đè hậu tố sao lưu thông thường

Hậu tố sao lưu là ~, trừ khi được đặt bằng --suffixhoặc SIMPLE_BACKUP_SUFFIX. Phương pháp kiểm soát phiên bản có thể được chọn thông qua --backuptùy chọn hoặc thông qua VERSION_CONTROLbiến môi trường. Dưới đây là các giá trị:

  • none, off: không bao giờ tạo bản sao lưu (ngay cả khi --backupđược cung cấp)
  • numbered, t: tạo các bản sao lưu được đánh số
  • existing, nil: được đánh số nếu sao lưu được đánh số tồn tại, nếu không thì đơn giản
  • simple, never: luôn tạo các bản sao lưu đơn giản

Thí dụ

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

Điều này sẽ sao chép tất cả các file trong ~/Musicđể ~/Videos. Nếu một tệp cùng tên tồn tại ở đích, nó sẽ được đổi tên bằng cách thêm .origvào tên của nó làm bản sao lưu. Nếu một tệp có cùng tên với bản sao lưu tồn tại, thay vào đó, bản sao lưu sẽ được đổi tên bằng cách nối thêm .1và nếu đó cũng tồn tại .2. Chỉ sau đó là tập tin nguồn được sao chép đến đích.

Nếu bạn muốn sao chép tệp trong thư mục con, hãy sử dụng đệ quy:

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

Cảm ơn đề nghị sử dụng một trình quản lý tập tin khác. Thật không may, Thunar cũng không có tùy chọn mà tôi đang đề cập đến. Nó chỉ có: Hủy, Bỏ qua Tất cả, Bỏ qua, Thay thế, Thay thế Tất cả. Sẽ thử cá heo.
heisenbergman

1
Cá heo hoạt động rất tốt cho việc này :)
heisenbergman

Cảm ơn đã thử hai. Tôi sẽ cập nhật câu hỏi của tôi theo phát hiện của bạn.
David Foerster

@heisenbergman, Xin chào, ý của bạn là gì bởi cá heo hoạt động tuyệt vời cho việc này? Nó cung cấp tùy chọn để đổi tên, nhưng nó vẫn chỉ cho phép tôi đổi tên từng tệp một. Thật không may, tùy chọn "áp dụng cho tất cả" không thể được sử dụng với tùy chọn để đổi tên. Điều này khá vô dụng đối với một lượng lớn tệp. Đây chỉ là phiên bản của tôi? Bạn có quản lý để đổi tên tất cả các nhân đôi của mình cùng một lúc (như bạn có thể trong Windows) bằng cách sử dụng Cá heo không?
Kvothe

2

Tìm thấy điều này trên superuser :

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

Tệp có cùng tên được đổi tên thành tệp có md5sum được thêm vào tên. Nếu bạn lưu nó vào một tên tệp như "saveCopy", bạn có thể sử dụng findnhư thế này để thực thi nó:

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

Để biết thêm về điều này xem liên kết.



0

Sao chép tập lệnh này vào thư mục trên cùng, làm cho nó có thể thực thi được và chạy nó:

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.