Sao chép tập tin với đổi tên


28

Tôi có một cây tập tin lớn. Một số tệp có cùng tên nhưng trong trường hợp khác nhau, ví dụ: some_code.cSome_Code.c.

Vì vậy, khi tôi đang cố sao chép nó vào một hệ thống tệp NTFS / FAT, nó sẽ hỏi tôi về việc tôi muốn nó thay thế tệp hay bỏ qua nó.

Có cách nào để tự động đổi tên các tệp đó, ví dụ, bằng cách thêm  (1)vào tên của tệp xung đột (như Windows 7 không)?


Hiếu kỳ. Tôi chỉ muốn xem, tôi gặp phải loại lỗi nào nếu tôi cố gắng tạo một tệp có cùng tên trên phân vùng NTFS (HPFS / NTFS, theo sudo fdisk -l /dev/sda), và đã touch foo; touch Fookết thúc với 2 tệp fooFoo. Nhưng tôi không tò mò enogh để khởi động lại vào Windows, để xem chúng trông như thế nào ở đó. Migth nó chỉ là một vấn đề FAT? À - Tôi có USB-Stick với FAT và có thể tạo một hệ thống FAT trong một tệp, ... - vui lòng chờ một lát. :)
người dùng không xác định

Câu trả lời:


41

Nhiều công cụ GNU như cp, mvtarhỗ trợ tạo file sao lưu khi mục tiêu tồn tại. Đó là, khi sao chép foovào bar, nếu đã có một tệp được gọi bar, tệp hiện có bar sẽ được đổi tên và sau khi sao chép barsẽ chứa nội dung của foo. Theo mặc định, barđược đổi tên thành bar~, nhưng hành vi có thể được sửa đổi:

                                # 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)

Có các biến thể khác, chẳng hạn như tạo các bản sao lưu được đánh số chỉ khi một bản đã tồn tại. Xem hướng dẫn sử dụng coreutils để biết thêm chi tiết.


1
Rực rỡ. Tôi không biết tùy chọn này tồn tại và nó chỉ tỏ ra cực kỳ hữu ích. Cảm ơn @Gilles.
Steve Hill

2
OSX cp không có cờ - dự phòng. sử dụng brew install coreutilsvà sau đó sử dụng lệnh gcpthay thế.
Weston Ganger

6

Tôi đã thử

apropos copy | grep "(1)" 

để tìm ứng viên có thể, và mcopy xuất hiện.

man mcopy 

cho thấy một lựa chọn đầy hứa hẹn -D clash-optionkhông phải là mát mẻ? Nhưng không tuyệt lắm - nó không được mô tả. Nhưng có một số gợi ý cho mtools.dvi, mà tôi đã tìm kiếm trên hệ thống của mình, nhưng không thành công và qua google, không thành công, nhưng sau đó, với google, tôi đã tìm kiếm trực tiếp mcopy clash-optiontìm thấy trang web này .

Tôi đã làm một bài kiểm tra ngắn

mcopy -D A f* a 

để kiểm tra tên tự động và targetdir a- thay vì tự động đặt tên, nó yêu cầu tôi cho mọi tệp để bỏ qua hoặc ghi đè, đó là ...

Phiên bản của tôi là mtools-4.0.10và trang trợ giúp từ năm 1996 - 15 tuổi. Chúng ta có nên thực sự mất một số tính năng, trong khi đó?

Tôi sẽ chia công việc thành hai bước:

  • Tạo một hàm ngắn, tạo một tên duy nhất cho một tệp, nếu tên đó bị chiếm dụng.
  • Chạy findvà thực thi tập lệnh đó cho mọi tệp bạn muốn sao chép.

Chúng ta sẽ hỗ trợ trong phương pháp này? :)

Đây là một tập lệnh, để tự động đặt tên tệp:

#!/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} 

và đây là lời mời thử nghiệm của tôi:

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

Lưu ý: -maxdepth, -name và -type được sử dụng để hạn chế số lượng tệp bị ảnh hưởng đáng kể. Tôi đã không kiểm tra tập lệnh cho các cấu trúc tệp sâu hơn, cũng như các khoảng trống trong tên tệp và các ký tự khác, vui nhộn như linefeed, pagefeed, v.v.

Tôi đã sử dụng .1 vì nó không gây rắc rối trong hầu hết các lệnh, trong khi a (và a) thường cần che.



0

Không phải với GNU cp, ít nhất.

Bạn được khuyến cáo không nên có tên tệp trùng lặp (bỏ qua trường hợp), chúng sẽ chỉ khiến bạn trở thành một thế giới đau khổ. Tìm một danh sách các bản sao như vậy bằng cách sử dụng

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

Sau đó, tự đổi tên một trong các tệp cho mỗi dòng nếu đầu ra. Cố gắng tránh tạo ra các bản sao trong tương lai.


Anh chàng không bao giờ ngụ ý rằng anh ta là người tạo ra mớ hỗn độn đó.
tshepang

Vâng, đúng, đúng, nhưng anh ấy là người phải chịu hậu quả
jmtd

Tôi có một tình huống mà tôi đã kết thúc với các bản sao lưu từ những thời điểm hơi khác nhau. Muốn kết hợp chúng, nhưng không clobber phiên bản khác nhau. Ví dụ, đối với tất cả những gì tôi biết, cái cũ hơn có thể tốt hơn. Chỉ có thể nói sau khi tôi kiểm tra. Trong thời gian đó, cần sao chép và đổi tên các bản sao lưu.
abalter
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.