Có cách nào để tự động làm mới lệnh ít hơn không?


141

Tôi thích watchlệnh, nhưng nó có những hạn chế .

Tôi tò mò muốn biết liệu tôi có thể bắt chước chức năng của watchvới less. Tôi chủ yếu tìm kiếm khả năng cuộn qua thư mục của mình khi nó tự động được sửa đổi thông qua một tập lệnh đang chạy.


Tôi đang tìm kiếm tail -f foo.log | grep barvà để có thể tự động thay đổi lệnh grep bằng cách khởi động lại đường dẫn tail / grep.
Alexander Mills

Câu trả lời:


119

Trong less, bạn có thể gõ Fđể tiếp tục đọc ở cuối tệp (như tail -f); bạn có thể nhập :evà tên tệp để xem một tệp khác, nhưng thật không may, nếu bạn nhập tên của tệp hiện tại, lesssẽ không tải lại tệp. Tuy nhiên, có một mẹo để làm cho nó đọc lại tệp hiện tại, được đề xuất bởi sabgenton : :evà nhập tên của tệp không tồn tại ; khiến ít hơn hiển thị thông báo lỗi và sau đó tải lại tệp hiện tại.

Nếu bạn đang tìm kiếm một giải pháp thay thế watch ls, đây là một vài:

  • Các trình quản lý tệp hiện đại (ví dụ Nautilus, Thunar, Konqueror, Dolphin, Finder) làm mới các chế độ xem trong thời gian thực.
  • Emacs không có làm mới theo thời gian thực, nhưng với auto-revert-mode, nó sẽ tải lại tệp hoặc thư mục cứ sau 5 giây (độ trễ là cấu hình).
  • Mặc dù w3m chủ yếu là một trình duyệt web, nhưng nó làm cho một thư mục và trình xem tệp văn bản có thể qua được. Nhấn Rđể tải lại URL (cục bộ).

6
Đối với tôi: e Randomnamejkdlfjldf không tải được tên tệp không tồn tại sau đó tải lại vào tệp hiện tại: D
sabgenton 18/03/2016

1
@sabgenton Cảm ơn, tôi không biết điều đó. Đó là một mẹo hay. Tôi đã thêm nó vào câu trả lời của mình, nhưng bạn có thể đăng nó dưới dạng câu trả lời của riêng bạn (mà tôi hy vọng Zaid sẽ chấp nhận).
Gilles

1
@CMCDragonkai Không, less +Fchỉ xem đồng hồ cho nội dung được nối thêm. Sử dụng :e nonexistentfileđể đọc lại đầu vào thay đổi hoàn toàn.
Gilles

1
Có một cờ dòng lệnh cho điều đó?
CMCDragonkai

3
@PaulWagland Không, Rkhông đáng tin cậy làm mới tệp. Nó làm mới màn hình và xóa một số bộ đệm đầu vào, nhưng thực tế nó không tải lại dữ liệu từ tệp trong mọi trường hợp (chỉ khi tệp lớn? Tôi không đào sâu vào mã).
Gilles

65

Shift+Fsẽ làm lesstương tự như tailf. Đó là, nó được làm mới nếu có thêm dữ liệu vào tệp.


7
Lưu ý rằng điều này chỉ hoạt động cho các phụ lục. Nếu các dòng bị xóa hoặc chỉnh sửa tại chỗ, lesssẽ không hiển thị những thay đổi đó.
Nathaniel M. Beaver

Làm cách nào để dừng chế độ sau và nhập lại chế độ có thể cuộn?
Tom Hale

1
<kbd> Ctrl + C </ kbd>
balki

1
balki Kinh nghiệm của tôi là điều này sẽ giết chết lệnh truyền dữ liệu nếu bạn đang sử dụng $COMMAND | less. Tôi tự hỏi nếu có một cách tốt đẹp xung quanh này? Bạn có thể làm những thứ như thế $COMMAND > /tmp/file & less /tmp/filenhưng điều đó không hay lắm.
Att Righ

@AttRigh Tôi chưa bao giờ giết lệnh của mình (tuy nhiên tôi đọc nhật ký của các lệnh đang chạy theo cách này, tôi không chuyển thành ít hơn, về mặt kỹ thuật)
jena

41

Đơn giản chỉ cần gõ:

less +F filename

Điều này giả lập nhấn "F" trong trình chỉnh sửa.


1
Cảm ơn; thêm bí danh alias check="less +F"cho tôi .bashrc.
Luke Davis

22

mancác trang có thể rất nhiều thông tin. Đừng bị đe dọa bởi chúng. Trong số mọi thứ khác, man lessnói rằng bạn có thể sử dụng Rlệnh để:

   R      Repaint the screen, discarding any buffered input.  Useful if the file is changing while it is being viewed.

(Tôi nhận ra câu hỏi này đã hơn 6 tuổi, nhưng nó xuất hiện trên các tìm kiếm của google, vì vậy tôi không phải là người duy nhất nhấp vào liên kết để đến đây.)


7
Điều này sẽ sơn lại màn hình trong trường hợp nó bị gián đoạn bởi đầu ra từ một chương trình khác. Nó không liên tục tải lại tập tin. Tôi đã không đào sâu vào mã để xem nó làm gì, các tệp ngắn thử nghiệm không được tải lại. Tôi chắc chắn không bị đe dọa bởi các trang của người đàn ông và tôi nói rằng mô tả này được diễn đạt kém: Lời nói lại không truyền tải rằng đầu vào được đọc lại và hành vi thực tế không hoàn toàn phù hợp với hữu ích nếu tập tin đang thay đổi (có thể đó là một Tôi không biết vì tôi không biết lệnh này phải làm gì) ..
Gilles

Tôi cũng không phải là chuyên gia và cũng không đọc mã nguồn ít hơn, nhưng những gì nó làm là quên những gì nó đã biết về tệp và tải lại nó, làm mới đầu ra của nó dựa trên đầu vào mà nó tải lại. Câu hỏi có nội dung "Có cách nào để tự động làm mới lệnh ít hơn không?" Nếu tôi đã đọc kỹ lời giải thích của câu hỏi trước khi trả lời, tôi có thể đã không trả lời, vì họ tiếp tục nói rằng họ muốn "cuộn qua thư mục của tôi khi nó tự động được sửa đổi thông qua một tập lệnh đang chạy." Ít hơn sẽ không phải là mệnh lệnh đúng cho điều đó.
Destenson

Hoạt động tốt với tôi, ngay cả khi sử dụng tệp dài 3 byte. Tôi không thể tưởng tượng tại sao nó cũng không hoạt động cho các tệp lớn hơn.
Addison

1
Tuyệt quá! Đối với tôi nó hoạt động cho cả các tập tin ngắn và dài. Tôi chỉ nhận thấy hai vấn đề có thể xảy ra: 1. lesskhông mở lại tệp bằng tên tệp của nó - tức là khi inode của tệp thay đổi (như ghi đè tệp bằng cách sử dụng mv) thì nội dung tệp cũ vẫn ở lại (có lẽ là inode cũ đã đọc lại) - - 2. Dòng hiển thị đầu tiên có thể bắt đầu ở cùng độ lệch byte như trong nội dung tệp gốc. Vì vậy, khi độ dài dòng thay đổi, dòng hiển thị đầu tiên có thể không đầy đủ và các dòng được hiển thị có thể di chuyển lên / xuống.
pabouk

Rkhông phải lúc nào cũng làm việc Xem unix.stackexchange.com/questions/4351/ Cách
wvducky

5

Phím "F" khi chạy lesssẽ thực hiện "theo dõi" tương tự tail -f, nhưng tôi không chắc liệu điều đó có đạt được những gì bạn đang tìm kiếm ở đây không.


5

Tôi thường chỉ gõ Gđể theo dõi đầu ra trên cơ sở một lần. Tôi thấy nó đặc biệt hữu ích trên hệ thống tệp mạng aa như CIFS.


Đây là nhiều hơn một lần làm mới theo yêu cầu của tập tin được mở với ít hơn. Ngoài việc nhảy đến cuối tập tin, nó cũng tải lại tập tin nếu nó đã thay đổi.
jorb

1
Cảm ơn. Lần đầu tiên nó không làm mới cho tôi, nhưng bây giờ nó có vẻ hoạt động tốt. Trong người đàn ông, nó không được viết rằng nó làm mới tập tin. man less: 'G hoặc> hoặc ESC-> Chuyển đến dòng N trong tệp, mặc định phần cuối của tệp.' Tôi xóa bình luận sai cũ của tôi ở đây, xin lỗi cho họ.
Yaroslav Nikitenko

1
BTW, bạn gọi 'cơ sở một lần' là gì? Người duy trì less, Mark Nudelman, đã trả lời như sau: "Lệnh G thường không bắt buộc đọc lại tệp như lệnh R. Nó có vẻ như vậy nếu phần cuối của tệp chưa được đọc khi G được gọi, do đó lần đầu tiên nhảy đến cuối tệp phải đọc dữ liệu ở đó. Ví dụ: nếu bạn nhảy đến cuối bằng G, sau đó nhảy trở lại từ đầu với 1G, sau đó một chương trình khác sẽ sửa đổi dữ liệu tại phần cuối của tập tin (không thay đổi độ dài), "(tiếp)
Yaroslav Nikitenko

(cont) "sau đó bạn lại nhảy đến cuối cùng với G, bạn sẽ không thấy dữ liệu đã sửa đổi. Nhưng nếu bạn không nhảy đến cuối và quay lại từ đầu, thì lần đầu tiên bạn thực hiện lệnh G, nó phải đọc dữ liệu ở đó lần đầu tiên, và tất nhiên nó sẽ thấy bất kỳ sửa đổi nào đã xảy ra kể từ khi ít được gọi lần đầu tiên. "
Yaroslav Nikitenko

Trong trường hợp này tôi đã đề cập nó là một lần làm mới một lần trái ngược với làm mới năng động , đó là một phần của những gì câu hỏi ban đầu đang hỏi.
jorb

1

Bạn có thể sử dụng vim để đọc tệp sau đó thêm ánh xạ sau vào .vimrctệp của mình và bạn có thể dễ dàng tải lại tệp bằng ,r:

let mapleader = ","
nnoremap <leader>r :edit <CR>

Lưu ý nếu bạn đã chỉnh sửa tập tin rồi, vim sẽ phàn nàn. Chỉ cần thay đổi thành

let mapleader = ","
nnoremap <leader>r :edit! <CR>

Để bỏ qua những thay đổi.


Họ sẽ phải cạy vimtừ bàn tay lạnh lẽo, chết chóc của bạn. Bối cảnh của câu hỏi là về bản thân less, nhưng với tư cách là một người có khuynh hướng đơn nhân , tôi đồng cảm!
Benjamin R

1

Rđể sơn lại không phải lúc nào cũng tải lại tập tin. [1]

Một cách giải quyết luôn tải lại tệp là nhấn hq, sẽ mở trang Trợ giúp, sau đó thoát. Nó có tác dụng phụ là buộc tập tin tải lại.


[1] Dưới đây là một số ví dụ về các tình huống Rlàm và không tải lại:

  • >>>thay đổi: KHÔNG được tải lại
  • sed -i, gEdit, TextEdit: KHÔNG được tải lại
  • Trên Linux, các vithay đổi: KHÔNG được tải lại
  • Trên máy Mac, vithay đổi: KHÔNG được tải lại

Tôi tin rằng sự khác biệt liên quan đến việc liệu inode có thay đổi hay không (bạn có thể kiểm tra ls -i foo.txt). Nếu inode thay đổi, sau đó Rsẽ không hoạt động.


0

Bạn có thể chuyển nó sang tail -fthay thế, nó sẽ dẫn đến kết quả đầu ra. Bạn sẽ mất khả năng di chuyển (cuộn) qua đầu ra của bạn.


0

Nếu bạn không phản đối việc sử dụng trình duyệt, bạn có thể khởi chạy máy chủ web Algernon bằng lệnh này:

algernon -a -t /directory/name

Một danh sách các tệp sau đó sẽ được hiển thị và tự động làm mới, tại http: // localhost: 3000 /


Sai chủ đề? ..
Tomasz

Nó dường như là một cách để xem một thư mục, mặc dù đó là một chặng đường dài từless
Jeff Schaller

0

Tôi chỉ tìm thấy chủ đề này như bất cứ ai khác. Tôi muốn thêm giải pháp khi bạn đã ở cuối tệp, sử dụng 'g' theo sau 'G' sẽ buộc làm mới tệp.

Cuối cùng tôi đã tạo một nút macro cho chương trình đầu cuối này (SecureCRT). Macro chỉ đơn giản là 'gG'.

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.