Làm thế nào để nối ngày vào tập tin sao lưu


70

Tôi cần tạo một bản sao lưu của một tập tin và tôi muốn có dấu thời gian như một phần của tên để làm cho nó dễ phân biệt hơn.

Làm thế nào bạn sẽ tiêm ngày hiện tại vào một lệnh sao chép?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

Câu trả lời:


109

Điều này không hoạt động vì lệnh datetrả về một chuỗi có khoảng trắng trong đó.

$ date
Wed Oct 16 19:20:51 EDT 2013

Nếu bạn thực sự muốn tên tập tin như vậy, bạn sẽ cần phải bọc chuỗi đó trong dấu ngoặc kép.

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

Có lẽ bạn đang nghĩ về một chuỗi khác sẽ được thêm vào sẽ là phỏng đoán của tôi. Tôi thường sử dụng một cái gì đó như thế này:

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

Xem trang man để biết ngày để biết thêm các mã định dạng xung quanh đầu ra cho ngày & giờ.

Định dạng bổ sung

Nếu bạn muốn kiểm soát hoàn toàn nếu bạn tham khảo trang người đàn ông, bạn có thể làm những việc như thế này:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

LƯU Ý: Bạn có thể sử dụng date -Ihoặc date --iso-8601sẽ tạo ra đầu ra giống hệt nhau date +"%Y-%m-%d. Công tắc này cũng có khả năng lấy một đối số để chỉ ra các định dạng thời gian khác nhau :

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601
Valid arguments are:
  - hours
  - minutes
  - date
  - seconds
  - ns
Try 'date --help' for more information.

Ví dụ:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

1
+1 - Tôi luôn sử dụng công cụ xác định định dạng cho ngày, "% Y% m% d-% H% M% S" hoặc "% y% m% d-% H% M% S".
ChuckCottrill

Chỉ cần touch foo`date +%F`hoạt động tốt.
Vadzim

báo trước: Điều này không hoạt động trong cshvỏ
Govinda Sakhare

1
@GovindaSakhare - csh / tcsh chuyển ký hiệu subshell thành backticks ( ...) thay vì $(..). Vỏ C rõ ràng không hỗ trợ ký hiệu đó cho các lớp con.
slm

date +"%Y-%m-%d"cũng giống như date -I. Tôi đã giới thiệu các định dạng iso anyway. Độ chính xác có thể được chỉ định bằng cách thêm giờ, phút, giây hoặc ns vào tham số -I. Ví dụ date -Iseconds.
Đến

13
cp foo.txt {,.backup.`date`}

Điều này mở rộng đến một cái gì đó như cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. Khoảng trống trước khi niềng răng bắt đầu một từ mới.

cp foo.txt {,.backup. $((date)) }

Các dấu ngoặc nhọn trong các từ riêng biệt, vì vậy chúng được giải thích theo nghĩa đen. Hơn nữa, $((…))là cú pháp để mở rộng số học; đầu ra của datekhông có gì giống như một biểu thức số học. Thay thế lệnh sử dụng một bộ dấu ngoặc đơn : $(date).

cp foo.txt foo.backup.`date`

Gần hơn. Bạn có thể đã thể hiện điều này với niềng răng như cp foo.{txt,.backup.`date`}. Vẫn còn vấn đề là đầu ra của datekhoảng trắng, vì vậy nó cần được đặt trong dấu ngoặc kép. Điều này sẽ làm việc:

cp foo.{txt,backup."`date`"}

hoặc là

cp foo.{txt,backup."$(date)"}

Định dạng đầu ra mặc định datekhông phù hợp với tên tệp và thậm chí nó có thể không hoạt động nếu một miền sử dụng các /ký tự ở định dạng đầu ra mặc định. Sử dụng định dạng ngày YMD sao cho thứ tự từ vựng trên tên tệp là thứ tự thời gian (và cũng để tránh sự mơ hồ giữa các định dạng ngày của Hoa Kỳ và quốc tế).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

cái cuối cùng đã cho tôi cp: target `foo..backup.20160913-134158 'không phải là một thư mục
Kalpesh Soni

@KalpeshSoni Lệnh chính xác tôi đã đăng không thể tạo thông báo lỗi này. Bạn phải sử dụng một lệnh khác.
Gilles

10

Nếu bạn thực sự muốn sử dụng ngày dài, bạn nên bảo vệ backtick. Định dạng ngày này là nó có các khoảng trắng được nhúng, không có trong vỏ Unix trừ khi bạn đặt chúng trong dấu ngoặc kép (hoặc thoát chúng theo một cách khác).

cp foo.txt "foo-`date`.txt"

Tuy nhiên, tôi thích sử dụng định dạng ISO ngắn hơn:

cp foo.txt foo-`date --iso`.txt

5

Sử dụng một chức năng, nó sẽ làm cho cuộc sống của bạn dễ dàng hơn. Đây là những gì tôi sử dụng:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

Như datecó mặc định khoảng trắng trong đầu ra của nó, lệnh cuối cùng của bạn không thành công. Nếu bạn đã trích dẫn đối số cuối cùng bên trong ", nó sẽ hoạt động. Các lần thử khác của bạn chỉ sai cú pháp

Đây là một giải pháp khả thi mà không cần khoảng trắng:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

hoặc là

cp foo.txt foo.backup.`date --iso-8601=seconds`

Nếu bạn thêm

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

để .bashrcđăng nhập lại và để bash của bạn đọc lại nó, bạn chỉ cần gọi bk file.txt.


Hướng dẫn sử dụng ngày RHEL của tôi không hiển thị công --iso-8601tắc, vì vậy tôi đặt liên kết ở đây. Tùy chọn ngày của GNU: --iso-8601
Ivan Chau

3

Bạn sao chép tệp vào tệp sao lưu có tên được tạo bằng dấu thời gian được nối thêm

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

HOẶC LÀ:

Bạn có thể hiển thị nội dung của tệp bằng cách sử dụng "cat" và chuyển hướng đầu ra sang tệp sao lưu có tên được tạo bằng dấu thời gian được nối thêm

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

Bạn cũng có thể sử dụng nhiều tùy chọn điều khiển FORMAT theo nhu cầu của mình Ví dụ:% H,% M,% S, v.v.


Lợi thế của catviệc chuyển hướng là cpgì?
Guido

Nó chỉ là cách thay thế để làm như vậy
Atul Rokade

2

Khi tôi phải tạo một bản sao lưu của một tập tin, tôi thường chỉ làm theo cách này.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
Điều này không thêm gì mà những câu trả lời khác chưa được đưa ra. Ngoài ra, %Fđịnh dạng ngày tạo ra các tháng có 2 chữ số và ls -lthường cung cấp nhiều thông tin hơn một chút so với tên tệp.
Kusalananda

1

Trong bash bạn có thể gõ:

cp /path/to/long/filename !#$_$(date +Is)

Mở rộng ra:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

Kết quả là:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

Thịt bò được date -Is. Tôi thích sử dụng nó vì nó dễ nhớ, gõ và cho phép các phiên bản ngắn (như -Innếu bạn là người thích chính xác).


! bắt đầu một người chỉ định sự kiện:

 !#     The entire command line typed so far.

$là một từ chỉ định:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

0

Nếu bạn chỉ muốn sao lưu tệp hoặc thư mục thì tại sao lại nhập đích, chỉ cần sử dụng phần mở rộng shell để thêm ngày vào cuối tên tệp sao chép.

I E

cp filename.sh{,."`date`"}

kết quả là

filename.sh.Sun 29 Sep 00:44:43 BST 2019

hoặc đơn giản là sử dụng

cp filename{,.20190929}

filename.sh.20190929

Nối ngày để đáp ứng nhu cầu của bạn. :)

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.