mv, đổi tên nếu tồn tại


26

Tôi cần phải tập hợp rất nhiều hình ảnh vào một thư mục. Nhiều trong số những hình ảnh có cùng tên tập tin.

Có một số phiên bản an toàn mvsẽ tự động đổi tên các tệp nếu tên tệp đích đã tồn tại để pic1.jpegtrở thành một cái gì đó như thế pic1_2.jpegnào?

Tôi có thể viết kịch bản python của riêng mình nhưng phải có một cái gì đó như thế này để tôi có thể làm:

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

Câu trả lời:


38

mv đã hỗ trợ điều này ngay lập tức (ít nhất là trong Debian):

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

Như đã thấy trong 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.

Để thực hiện --backup=tnghĩa là "tạo bản sao lưu được đánh số", hãy gọi như sau:

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

(dĩ nhiên Dest_file có thể là một thư mục).

Chỉnh sửa: trong các phiên bản sau (ít nhất là GNU coreutils 8.22 nhưng hoàn toàn sớm hơn nhiều) bạn chỉ cần viết

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

1
+1 cho một giải pháp sạch tuyệt vời. BTW tùy chọn cũng có mặt trên RHEL 6.
Paweł Brodacki

Mặc dù chức năng tốt, nhưng điều này thực sự không giúp được gì nhiều trong trường hợp của tôi vì nó sẽ nối thêm hậu tố sau phần mở rộng, vì vậy các tệp sẽ kết thúc bằng các tên như .jpg ~ 1 ~ trong khi tôi sẽ cần chúng được đặt tên là _1.jpg. Tôi có thể sẽ sử dụng mmv để đổi tên các tập tin sau khi di chuyển chúng.
theduke

4
đây là lệnh mmv rằng sẽ đạt được kết quả mong muốn của tôi sau khi làm mv --backup = số: mmv -v " "# 1_ # 3. # 2" ~ * ~."
theduke

Trên hệ thống Debian của tôi (mmv 1.01b-18), lệnh mmv chính xác là:mmv -v "*.*~*~" "#1_#3.#2"
Xavier
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.