Thêm dấu thời gian vào tên tệp có mv trong BASH


82

Chà, tôi là một người mới sử dụng Linux và tôi đang gặp sự cố với một tập lệnh bash đơn giản.

Tôi có một chương trình thêm vào tệp nhật ký khi nó đang chạy. Theo thời gian, tệp nhật ký đó trở nên lớn. Tôi muốn tạo một tập lệnh khởi động sẽ đổi tên và di chuyển tệp nhật ký trước mỗi lần chạy, tạo hiệu quả các tệp nhật ký riêng biệt cho mỗi lần chạy chương trình. Đây là những gì tôi có cho đến nay:

pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

Khi chạy, tôi thấy điều này:

: command not found
program

Khi tôi cd vào thư mục nhật ký và chạy dir, tôi thấy điều này:

201111211437\r.log\r

Chuyện gì vậy? Tôi cho rằng có một số vấn đề về cú pháp mà tôi đang thiếu, nhưng dường như tôi không thể tìm ra.


CẬP NHẬT: Nhờ nhận xét của shellter bên dưới, tôi thấy vấn đề là do tôi đang chỉnh sửa tệp .sh trong Notepad ++ trong cửa sổ, sau đó gửi qua ftp đến máy chủ, nơi tôi chạy tệp qua ssh . Sau khi chạy dos2unix trên tệp, nó hoạt động.

Câu hỏi mới: Làm cách nào để tôi có thể lưu tệp chính xác ngay từ đầu, để tránh phải thực hiện sửa lỗi này mỗi khi tôi gửi lại tệp?


2
\rđược carriage_return, kiểm tra kịch bản bash của bạn, có thể được bao gồm bên trong kịch bản
ajreal

Giá trị xuống dòng đó sẽ đến từ đâu? Tôi đoán rằng có điều gì đó logs/$DATE.logkhông ổn, nhưng việc nhập sẽ echo logs/$DATE.logxuất ra đường dẫn chính xác.
Cat5InTheCradle

sao tôi biết được? xin vui lòng đính kèm các tập lệnh bash tương ứng, khả năng có whitepspaces không gây chú ý
ajreal

Thêm một liên kết pastebin đến bưu chính, nhưng đoạn mã đó là nghĩa đen toàn bộ kịch bản, tôi đã chỉ cần thay 'echo chương trình' cho dòng đó ra mắt một java .jar
Cat5InTheCradle

không có ý kiến ​​... có vẻ là đúng, làm thế nào về bạn cố gắng nối một số chuỗi sau DATE=$(date +"%Y%m%d%H%M")?
ajreal

Câu trả lời:


24

Với tôi, một vài dòng bạn đã đăng từ kịch bản của bạn có vẻ ổn. Nó có lẽ là một cái gì đó sâu hơn một chút.

Bạn cần tìm dòng nào đang cho bạn lỗi này. Thêm set -xvvào đầu tập lệnh của bạn. Thao tác này sẽ in ra số dòng và lệnh đang được thực thi tới STDERR . Điều này sẽ giúp bạn xác định nơi bạn đang gặp lỗi cụ thể này trong tập lệnh của mình.

BTW, bạn có một shebang ở đầu kịch bản của bạn không? Khi tôi nhìn thấy một cái gì đó như thế này, tôi thường mong đợi nó là một vấn đề với Shebang. Ví dụ: nếu bạn đã #! /bin/bashở trên cùng, nhưng trình thông dịch bash của bạn được đặt ở đó /usr/bin/bash, bạn sẽ thấy lỗi này.

BIÊN TẬP

Câu hỏi mới: Làm cách nào để tôi có thể lưu tệp chính xác ngay từ đầu, để tránh phải thực hiện sửa lỗi này mỗi khi tôi gửi lại tệp?

Hai lối:

  1. Chọn mục menu Chỉnh sửa-> Chuyển đổi EOL-> Định dạng Unix khi bạn chỉnh sửa tệp. Khi nó có phần cuối dòng chính xác, Notepad ++ sẽ giữ chúng.
  2. Để đảm bảo tất cả các tệp mới có phần cuối dòng chính xác, hãy chuyển đến mục menu Cài đặt-> Tùy chọn và kéo hộp thoại Tùy chọn lên . Chọn tab Tài liệu Mới / Thư mục Mặc định . Trong Tài liệuĐịnh dạng Mới , hãy chọn nút radio Unix . Nhấp vào nút Đóng .

Tôi sẽ xem nếu tôi có thể thử điều đó. Chạy dos2unix sau khi tệp được chuyển đến máy chủ linux của tôi sẽ giải quyết được vấn đề, nhưng tôi đang tìm cách giải quyết bước bổ sung đó. Tôi không có shebang lúc đầu, đó có thể là chìa khóa.
Cat5InTheCradle

1
@AgentSnazz - À ha! Đó chính là vấn đề. Các tập lệnh Unix shell phải có phần cuối dòng Unix. Windows / MS-DOS sử dụng dòng cấp dữ liệu trả về xuống dòng (còn gọi là CRLF hoặc \ r \ n) để đánh dấu phần cuối của dòng. Unix chỉ sử dụng một dòng cấp dữ liệu (hay còn gọi là LF hoặc \ n). Nếu bạn đang chỉnh sửa tệp cho Unix trên máy Windows, bạn phải sử dụng trình chỉnh sửa chương trình có thể thực hiện các phần cuối dòng chính xác (như Vim hoặc Notepad ++ . Đừng bao giờ sử dụng Notepad . Đó là lý do tại sao bạn nhìn thấy \rtên tệp trong tên tệp. Có một ẩn \rsố ở cuối mỗi dòng trong chương trình của bạn.
David W.

79
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"nếu bash của bạn là một chút khác nhau
zinking

6
Với stress @ điểm zinking, có phải không là một khoảng trống giữa dấu cộng và dấu ngoặc kép
PUK

9

Phương thức một dòng trong bash hoạt động như thế này.

[một số ra mắt]> $ (ngày "+% Y.% m.% d-% H.% M.% S"). ver

sẽ tạo một tệp có tên dấu thời gian với phần mở rộng ver. Ảnh chụp nhanh danh sách tệp đang hoạt động vào tên tệp đóng dấu ngày tháng như sau có thể cho thấy nó đang hoạt động.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

Tất nhiên

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

hoặc thậm chí đơn giản hơn

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver


5

Tôi sử dụng lệnh này để xoay một tệp đơn giản:

mv output.log `date +%F`-output.log

Trong thư mục cục bộ tôi có 2019-09-25-output.log


4

Chà, đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng có một công cụ trong GNU / Linux có công việc là xoay các tệp nhật ký một cách thường xuyên, giữ cho các tệp cũ được nén ở một giới hạn nhất định. nó làlogrotate


Tôi sẽ xem xét điều đó, tôi thích phương pháp của mình vì nó kết thúc tốt đẹp mỗi lần chạy chương trình trong tệp nhật ký của riêng nó.
Cat5InTheCradle

1

Bạn có thể viết các tập lệnh của mình trong notepad nhưng chỉ cần đảm bảo bạn chuyển đổi chúng bằng cách sử dụng điều này -> $ sed -i 's / \ r $ //' yourcript here

Tôi sử dụng nó tất cả thời gian khi tôi làm việc trong cygwin và nó hoạt động. Hi vọng điêu nay co ich

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.