Nối ngày hiện tại từ một biến vào tên tệp


55

Tôi đang cố gắng thêm ngày hiện tại vào cuối tên tệp như thế này:

TheFile.log.2012-02-11

Đây là những gì tôi có cho đến nay:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Tuy nhiên, tất cả những gì tôi nhận được là tên của tệp và không có gì. Làm cách nào để thêm ngày hiện tại vào tên tệp?


khi bạn apppand date, đảm bảo không sử dụng :vì sau đó nó sẽ được đọc dưới dạng máy chủ lưu trữ trong rsync và scp. stackoverflow.com/a/37143274/390066
kirill_igum

Câu trả lời:


78

Nhiều khả năng đó là việc bạn sử dụng set. Điều đó sẽ gán 'hôm nay', '=' và đầu ra của datechương trình cho các tham số vị trí (còn gọi là đối số dòng lệnh). Bạn muốn chỉ sử dụng shell C (mà bạn đang gắn thẻ này là "bash", vì vậy rất có thể là không), bạn sẽ muốn sử dụng:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Lưu ý thiếu không gian xung quanh dấu bằng.

Bạn cũng không muốn sử dụng &vào cuối báo cáo của mình; Điều này làm cho shell không chờ lệnh kết thúc. Đặc biệt là khi một người dựa vào tiếp theo. Các findlệnh có thể thất bại bởi vì nó được bắt đầu trước mkdir.


Cảm ơn người bạn đời đó, giờ đây nó đã hoạt động tốt 100%, Chúc mừng cho người đứng đầu & và mkdir
TÔI LÀ L

55

Tập lệnh Bash để thêm một ngày vào một tên tệp:

Mã bash này trong tệp được gọi là a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Khi chạy, in:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Giải thích về mã:

Giải thích tập lệnh với trình thông dịch / bin / bash. Tạo một biến mới được gọi là ngày hôm nay. Thực hiện lệnh date, chuyển các cờ Y, m, d, H, M, S để cấu hình đầu ra. Đặt kết quả vào biến ngày.

Tạo một biến mới gọi là tên tệp, bao quanh biến $ today với phần còn lại của văn bản tên tệp tĩnh. sau đó lặp lại tên tệp để sàng lọc.

Nhồi nhét nó vào một lớp lót để tăng lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

Bạn dường như đã trộn lẫn một số điều.

set today = 'date +%Y'Trông giống như cú pháp tcsh, nhưng ngay cả trong tcsh, nó gán chuỗi date +%Ycho biến today, nó không chạy datelệnh. Vì bạn có thể đang sử dụng bash hoặc một số vỏ POSIX khác, cú pháp của bài tập là today=some_value(không có khoảng trắng xung quanh dấu bằng). Để chạy lệnh và gán đầu ra của nó cho biến, sử dụng lệnh thay thế :

today=$(date +%Y-%m-%d)

(Tôi cũng đã hoàn thành đặc tả ngày). Bạn có thể sử dụng backquote thay vì dấu ngoặc đơn đô la, nhưng nó dễ bị nhầm lẫn về mặt trực quan với các trích dẫn chuyển tiếp và các quy tắc khi bạn cần trích dẫn bên trong một lệnh backquote khá phức tạp và phụ thuộc vào việc triển khai, vì vậy tốt hơn là không nên tuân theo $(…)(mà có tác dụng tương tự với cú pháp saner).

Bạn đã sử dụng &ở cuối một số lệnh. Điều đó làm cho lệnh thực thi trong nền, điều không mong muốn ở đây. Tôi nghi ngờ bạn có nghĩa là &&, có nghĩa là chỉ thực hiện lệnh tiếp theo nếu lệnh đầu tiên thành công.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Một cách khác để sử dụng &&sau mỗi lệnh là bắt đầu tập lệnh của bạn với set -e. Điều này báo cho shell dừng thực thi tập lệnh ngay khi bất kỳ lệnh nào trả về trạng thái khác không (ngoại trừ các lệnh trong ifđiều kiện và một vài trường hợp khác).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

findLệnh của bạn vẫn ổn nhưng có lẽ không làm những gì bạn định làm (mặc dù tôi không biết chắc đó là gì).

Bạn đang tạo một thư mục với mkdirvà sau đó ngay lập tức duyệt qua nó find. Điều đó sẽ không hữu ích trừ khi thư mục đã tồn tại. Ý của bạn là tạo một thư mục cho nhật ký ngày hôm nay và di chuyển các tệp gần đây từ The_Logsmột thư mục có tên là eg The_Logs.2012-02-11?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Hay bạn có nghĩa là đổi tên các tệp nhật ký ngày nay để thêm hậu tố $today? Điều đó đòi hỏi phải tính toán tên tệp khác nhau cho mỗi tệp để di chuyển.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Lưu ý rằng tôi đã sử dụng -mtime, để di chuyển các tệp dựa trên thời gian sửa đổi của chúng, và không phải -atimelà thời gian tệp được đọc lần cuối (nếu hệ thống của bạn theo dõi điều đó - nếu không, thì thời gian có thể lùi xa như thời gian).


3

Bạn có thể đổi tên tập tin với dấu thời gian được thêm vào nó

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

Điều này:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

nên làm việc. Mặc dù, có vẻ như bạn đang sử dụng csh và giải pháp xóa dấu + của tôi có thể không hiệu quả với bạn nhưng sẽ không đau khi thử. Kèm theo biến của bạn trong {} dấu ngoặc nhọn, luôn là một ý tưởng tốt để ngăn chặn việc mở rộng biến không mong muốn.


Cảm ơn bạn, sau khi thêm sự điều chỉnh của bạn với câu trả lời khác, nó hoạt động tốt.
TÔI LÀ L
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.