Lệnh tìm Linux - hiển thị tiến trình


24

Tôi đã tự hỏi nếu có bất kỳ cách nào để hiển thị một số loại thông tin tiến bộ khi tìm kiếm các tập tin trong linux bằng cách sử dụng find. Tôi thường thấy mình đang tìm kiếm các tệp trên một đĩa lớn và một số loại chỉ báo tiến trình sẽ rất hữu ích, như một thanh hoặc ít nhất là thư mục hiện tại "tìm" tìm kiếm. Có tập lệnh nào thực hiện điều đó hay không findhỗ trợ một số hook ?


cảm ơn vì câu trả lời, tôi sẽ kiểm tra tất cả các giải pháp và quyết định xem giải pháp nào tốt hơn. Nếu nó tùy thuộc vào tôi, tôi sẽ đánh dấu tất cả các câu trả lời là được chấp nhận.
Vlad Balmos

tùy thuộc vào tiêu chí tìm kiếm nào bạn đang sử dụng định vị nhanh hơn nhiều so với tìm kiếm
B14D3

Câu trả lời:


28

với thủ thuật này, bạn có thể thấy thư mục hiện tại - nhưng không có thanh tiến trình - xin lỗi.

 watch readlink -f /proc/$(pidof find)/cwd

thật tuyệt Cần lưu ý rằng bạn cần các đặc quyền siêu người dùng để truy cập cwd. cảm ơn!
Vlad Balmos

Hoạt động hoàn hảo.
Jesse Glick

8

Một tiện ích nhỏ gọi là pv (xem ống) có thể giúp đỡ. Từ bản tóm tắt tuyệt vời của Peteris Krumins:

Trình xem ống là một công cụ dựa trên thiết bị đầu cuối để theo dõi tiến trình của dữ liệu thông qua một đường ống.

Bạn có thể sử dụng pv theo một số cách. Khi chơi xung quanh đây, tôi đặt nó ngay sau một đường ống để theo dõi tiến trình của đầu ra được tạo bởi find (nên chuyển stdin sang stdout không bị ảnh hưởng)

find / -mtime -1h | pv > /dev/null

Nó sẽ hiển thị đầu ra một chút như thế này:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(Tôi đã chuyển hướng thiết bị xuất chuẩn thành / dev / null để tôi có thể thấy thanh tiến trình đang hoạt động mà không có đầu ra bay qua. Đây có thể không phải là ý định của bạn với find, do đó, điều chỉnh phù hợp)

Tôi thực sự không chắc chắn điều này hoạt động tốt như thế nào trong tự nhiên. Đối với các "đắt" tìm thấy như ở trên (di chuyển từ gốc), nó dường như hoạt động khá tốt. Đối với các lệnh đơn giản hơn trong một nút sâu hơn trong cây thư mục, pv đã thất bại thảm hại. Các lệnh này đang trả về kết quả ngay lập tức, vì vậy một thanh tiến trình có thể được đưa ra ở đây.

Ở bất cứ giá nào, hãy chơi xung quanh và xem liệu điều này có hiệu quả với những gì bạn cần không. Thực phẩm cho suy nghĩ, ít nhất.


Thanh tiến trình đó sẽ hiển thị những gì? Không find, cũng không pvbiết tìm kiếm sẽ mất bao lâu ,, vì vậy họ không thể tính được tỷ lệ phần trăm. Tất cả những gì chúng ta có thể thấy trong pvđầu ra là thời gian kể từ khi tìm kiếm được bắt đầu.
minaev

Chính xác. Tôi đã nghĩ rằng có một số phép thuật đang diễn ra, ở đâu đó, cho phép pv kiểm tra tiến trình của thư mục (không chính xác). Cho đầu vào tiêu chuẩn ở tốc độ không đổi, pv chỉ cần di chuyển thanh tiến trình ở tần số không đổi. Cố gắng yes | pv > /dev/nullquan sát
tcdyl

1
+1 cho một tiện ích đẹp
Vlad Balmos

Đánh giá tiến bộ là không tầm thường. Thậm chí không có trình duyệt web tải các trang có thể làm điều đó. Tôi đoán đối với nội dung tệp bạn có thể chia cho kích thước tệp, nhưng đối với các luồng Unix bạn không biết tổng lượng dữ liệu thường và công cụ này có nghĩa là linh hoạt cho bất kỳ loại dữ liệu truyền phát nào, không chỉ các tệp.
Sridhar Sarnobat

7

Tôi đã tìm kiếm cái này ngày hôm nay và đến đây thông qua Google. Tôi đã có một phát hiện dài chạy trên OS X và rõ ràng, watchkhông tồn tại ở đó. Vì vậy, đây là một giải pháp khác:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = danh sách các tập tin đang mở
  • -Fn= chỉ hiển thị tên của tệp / thư mục (có tiền tố là ký tự 'n', bỏ qua phần này nếu bạn thích lsofđầu ra đầy đủ
  • -a= Tell lsofđể chỉ hiển thị các dòng khớp với tất cả các tiêu chí (theo mặc định, nó hiển thị các dòng khớp với bất kỳ tiêu chí nào )
  • -c find= hiển thị tệp / thư mục được mở theo quy trình có tên find(thực ra, quy trình có tên bắt đầu bằng find, nhưng nó phân biệt chữ hoa chữ thường nên Findersẽ không hiển thị)
  • -d cwd = hiển thị các dòng với FD (filedescriptor) cwd (thư mục làm việc hiện tại)
  • +r 10 = hiển thị đầu ra cứ sau 10 giây cho đến khi không tìm thấy tệp đang mở (quá trình tìm kiếm đã kết thúc)

Điều này sẽ hiển thị thư mục findđang xử lý cứ sau 10 giây, vì vậy nó sẽ đưa ra ý tưởng nếu findnó vẫn hoạt động và nó đã tiến triển bao xa.


5

Có một ví dụ về các tìm kiếm song song với findtrong man find. Sử dụng nó, bạn có thể thực hiện nhiều kiểm tra cho mỗi mục, thực hiện nhiều hành động tùy thuộc vào điều kiện nào hoạt động. Việc kiểm tra đầu tiên có thể là, ví dụ, đơn giản -print, vì vậy tất cả các tên được in ra thiết bị xuất chuẩn. Kiểm tra thứ hai sẽ làm những gì bạn muốn. Cái gì đó như:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Nếu kiểm tra thứ hai cũng sẽ hiển thị tên tệp, bạn có thể chuyển hướng một trong số chúng sang stderr bằng cách sử dụng -fprint /dev/stderr.


Tôi đã thử nghiệm điều này nhưng tôi nghĩ là đúng cách.
Rolf

2

AFAIK, nó không, và thực hiện nó sẽ không cần thiết.

... Hừm. Có lẽ một tập lệnh chạy find <target dir> -type dtrước, lưu trữ danh sách và sau đó lặp lại từng thư mục trước khi chạy một find <list item> -maxdepth 1 <rest of find parameters>vòng lặp for.

Lưu ý rằng bạn đang giao dịch / đáng kể / mất hiệu suất để đổi lấy việc có thể mơ hồ nhìn thấy những gì nó đang làm.


1

Đây là danh sách các tệp hiện tại được mở bằng find , vì vậy nó giống với những gì tìm kiếm đang tìm kiếm "ngay bây giờ".

Trọng lượng nhẹ của nó như là địa chỉ truy vấn chỉ của descriptos tập tin được sử dụng bởi tìm mỗi giây và không interfer trong tìm chính nó. Ngoài ra, bạn có thể làm điều đó với bất kỳ chương trình bạn muốn.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

Các grep -v /dev/là để ẩn file STDOUT, STDIN và stderr, đó là các tập tin dùng để nhận và in dữ liệu trên giao diện điều khiển 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.