Sao chép một tập tin và nối dấu thời gian


13

Tôi đã có hai vấn đề với tập lệnh của mình là sao chép các tập tin và thêm dấu thời gian vào tên.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Ở trên thêm Test2tên tệp, nhưng tôi muốn nó giữ tên tệp của tệp nguồn gốc trong ví dụ này được đặt tên Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

Vấn đề khác là khi tôi thêm %rmã dấu thời gian, tôi nhận được lỗi cho biết mục tiêu "PM" không phải là một thư mục. Tôi đang cố gắng để có được dấu thời gian là thời gian 12 giờ.


Thêm AM / PM thêm không gian trong tên tệp. Nếu bạn khăng khăng muốn dùng thử một cái gì đó như: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (ngày +% m-% d-% y-% r)"
Romeo Ninov

2
Hoặcdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Câu trả lời:


12

Một trong những vấn đề của bạn là bạn đã bỏ qua dấu ngoặc kép xung quanh thay thế lệnh, do đó đầu ra từ datelệnh được phân tách tại các khoảng trắng. Xem tại sao tập lệnh shell của tôi bị nghẹt trên khoảng trắng hoặc các ký tự đặc biệt khác? Đây là một lệnh hợp lệ:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Nếu bạn muốn thêm vào tên tệp gốc, bạn cần phải có tên đó trong một biến.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Nếu bạn đang sử dụng bash, bạn có thể sử dụng mở rộng nẹp thay thế.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Nếu bạn muốn sao chép tệp vào một thư mục khác và nối dấu thời gian vào tên tệp gốc, bạn có thể thực hiện theo cách này - ${source##*/} mở rộng đến giá trị sourcemà không có phần cuối cùng /(nó loại bỏ tiền tố dài nhất phù hợp với mẫu */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Nếu Test1là một thư mục, nó được sao chép đệ quy và các tệp trong thư mục giữ tên của chúng: chỉ thư mục toplevel được thêm dấu thời gian (ví dụ: Test1/foođược sao chép vào Test1-05-10-15-07:19:42 PM). Nếu bạn muốn nối dấu thời gian cho tất cả các tên tệp, đó là một vấn đề khác.

Sự lựa chọn định dạng dấu thời gian của bạn là một ý tưởng tồi: thật khó đọc đối với con người và khó sắp xếp. Bạn nên sử dụng một định dạng dễ đọc hơn và có thể được sắp xếp dễ dàng, nghĩa là với các phần theo thứ tự quan trọng giảm dần: năm, tháng, ngày, giờ, phút, giây và với sự tách biệt giữa phần ngày và phần thời gian.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"

Gilles, lệnh đầu tiên sẽ không hoạt động IMHO, kiểm tra vị trí của dấu ngoặc kép. Và xem bình luận của tôi cho câu hỏi
Romeo Ninov

@RomeoNinov Điều gì sai với lệnh đầu tiên? Bạn đã chạy nó và nhận được một lỗi?
Gilles 'SO- ngừng trở nên xấu xa'

Bạn nói đúng, lệnh date được thực thi trong subshell
Romeo Ninov

Gilles, sử dụng ví dụ trên của bạn, làm cách nào để sao chép tệp có thông tin dấu thời gian được đề cập ở trên sang thư mục khác. Lệnh sau không hoạt động:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian

@Brian Tôi không chắc là tôi đã hiểu bình luận của bạn, nhưng hãy xem bản chỉnh sửa của tôi.
Gilles 'SO- đừng trở nên xấu xa'
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.