tìm so với định vị


30

Có các lệnh findlocateđể tìm kiếm các tập tin trên đĩa.

Tôi biết rằng findxử lý đệ quy tất cả các thư mục con cần thiết để tìm kiếm tệp và do đó chậm nhưng cập nhật, trong khi locatesử dụng cơ sở dữ liệu được cập nhật mọi lúc và sau đó (khi chính xác?) Để nhanh chóng hiển thị kết quả có thể bị lỗi thời.

Có sự khác biệt nào khác không? Trong tình huống nào người ta sẽ thích cái này hay cái kia? Và khi nào locatecơ sở dữ liệu được cập nhật thường xuyên?



1
manpages.ubfox.com/manpages/trusty/man8/updatedb.8.html "updateb thường được chạy hàng ngày bởi cron (8) để cập nhật cơ sở dữ liệu mặc định."
Rinzwind

@Rinzwind Câu trả lời của U & L được liên kết thật tuyệt vời, thật đáng tiếc chúng ta không thể tạo ra các bản sao chéo trang. Nhưng bạn có biết nhiều hơn về cronjob, khi nào chính xác nó sẽ chạy? Sau khi khởi nghiệp? Tại một thời điểm cụ thể (tôi nghĩ rằng tôi chỉ đọc 1-2AM hoặc đại loại như vậy)? Điều gì xảy ra nếu nó đóng cửa vào thời điểm đó? Nó có khởi động khi máy tính không hoạt động không? Làm thế nào tôi có thể xem tuổi của cơ sở dữ liệu?
Chỉ huy Byte

2
@ByteCommander - Đó là những gì anacrondành cho. Tôi không biết nếu nó được cài đặt theo mặc định trên các hệ thống / máy chủ để bàn, nhưng nó là trên máy tính xách tay. Nó chạy khi khởi động và xem nếu có bất kỳ công việc cron nào nên chạy trong khi hệ thống tắt và chạy chúng. Nó thực sự hữu ích, nhưng có thể gây ra một số vấn đề nếu bạn có công việc được lên lịch từ nửa đêm. Điều đó có thể khiến công việc được chạy khi khởi động và sau đó một lần nữa khi thời gian đến - có thể ít hơn 24 giờ sau (đối với công việc hàng ngày.)
Joe

@Joe Vì vậy, nó sẽ chạy trong khi khởi động và làm chậm nó, hoặc nó sẽ chạy một thời gian sau khi khởi động, hoặc nó thường chạy với mức độ ưu tiên thấp đến mức nó chỉ chạy khi hệ thống gần như không hoạt động?
Chỉ huy Byte

Câu trả lời:


27

locatethực sự chỉ tốt cho việc tìm kiếm các tập tin và hiển thị chúng cho con người. Bạn có thể làm một vài điều với nó, nhưng tôi sẽ không đủ tin tưởng để phân tích và mà bạn nói là không thể đảm bảo trạng thái của cơ sở dữ liệu nội bộ, vì vậy nó chỉ được lên kế hoạch để chạy từ /etc/cron.daily/mlocatemột lần một ngày!

findlà sống. Nó lọc, loại trừ, thực thi. Nó phù hợp để phân tích cú pháp. Nó có thể xuất đường dẫn tương đối. Nó có thể xuất đường dẫn đầy đủ. Nó có thể làm mọi thứ dựa trên các thuộc tính, không chỉ tên.

locatechắc chắn có một vị trí trong hộp công cụ của tôi nhưng nó thường ở ngay dưới cùng như một nỗ lực cuối cùng để tìm kiếm thứ gì đó. Nó dễ hơn findquá.


2
Tôi thấy locatesẽ nhanh hơn nhiều nếu tôi muốn tìm kiếm toàn bộ hệ thống tập tin của mình. Và bạn có thể tự cập nhật cơ sở dữ liệu bằng cách sử dụng updatedbtrước khi sử dụng nó.
hytromo

Bạn biết làm thế nào mà cronjob được cấu hình chính xác? Nó chạy ở một thời điểm cụ thể hoặc khi hệ thống không hoạt động hoặc n phút sau khi khởi động? Bởi vì tôi nghĩ rằng tôi đã đọc được ở đâu đó rằng nó được lên lịch vào 1-2AM, khi máy của tôi thường bị tắt. Nó sẽ không bao giờ được cập nhật sau đó, ngoại trừ thủ công ( sudo updatedb)? Và có một cơ hội để xem cơ sở dữ liệu bao nhiêu tuổi?
Byte Commander

grep run-parts /etc/crontabBạn sẽ thấy rằng những điều này đang được quản lý thông qua anacron(mà bạn sẽ thấy thông qua man anacronkhả năng phục hồi tốt hơn đối với các hệ thống không phải lúc nào cũng có). Từ những gì tôi có thể thấy nó nên chạy nó khi khởi động thay vì nếu bạn bỏ lỡ thời gian cron ban đầu.
Oli

2
Tôi thấy rằng định vị không lập chỉ mục các phân vùng có thể tháo rời / không đếm được của tôi, vì vậy nếu tôi muốn tìm thứ gì đó trên chúng, tôi phải sử dụng find. Tất nhiên, định vị không có tất cả các tùy chọn tuyệt vời mà tìm thấy - muốn -exec command {} \;chạy một lệnh trên mỗi tệp được tìm thấy. Tôi thích sử dụng locate -bgiới hạn định vị để tìm các tệp khớp với thành phần cuối cùng của tên - mà không có phần còn lại của đường dẫn. Tôi thường thử nó trước vì nó quá nhanh. Ngoài ra, bạn có thể chạy sudo updatedbbất cứ lúc nào bạn muốn để làm mới cơ sở dữ liệu định vị.
Joe

nếu bạn cần tìm kiếm theo thời gian thực cũng hơi dễ, bạn có thể sử dụng một cái gì đó nhưls -R | grep 'file_name.txt'
jena 17/8/2016

8

Nhiều như tôi thích Oli (rất nhiều!) Tôi không đồng ý với anh ta về findmệnh lệnh. Tôi không thích nó.

find lệnh mất hơn ba phút

Lấy ví dụ lệnh đơn giản này:

$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
    (... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied

real    3m40.589s
user    0m4.156s
sys     0m8.874s

Phải mất hơn ba phút cho findđể tìm kiếm tất cả mọi thứ bắt đầu từ /. Theo mặc định, các dòng thông báo lỗi xuất hiện và bạn phải tìm kiếm thông qua chúng để tìm thấy những gì bạn đang tìm kiếm. Tuy nhiên, tốt hơn là greptìm kiếm toàn bộ ổ đĩa trong một chuỗi mất 53 giờ : `grep`ing tất cả các tệp cho một chuỗi mất nhiều thời gian

Tôi biết tôi có thể sử dụng các tham số của lệnh find để làm cho nó hoạt động tốt hơn nhưng vấn đề ở đây là thời gian cần thiết để chạy.

locate lệnh mất ít hơn một giây

Bây giờ hãy sử dụng locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

Lệnh xác định vị trí mất ít hơn một giây!

updatedb chỉ chạy một lần một ngày theo mặc định

Đúng là updatedblệnh cập nhật cơ sở dữ liệu định vị chỉ được chạy một lần một ngày theo mặc định. Bạn có thể chạy thủ công trước khi tìm kiếm các tệp vừa thêm bằng cách sử dụng:

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

Mặc dù việc này sẽ mất 3 giây, nhưng nó nhỏ so với find3+ phút của lệnh.

Tôi đã cập nhật của tôi sudo crontab -eđể bao gồm dòng ở dưới cùng:

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

Bây giờ cứ sau năm phút updatedblà chạy và locatecơ sở dữ liệu lệnh hầu như luôn cập nhật.

Nhưng không có thuộc tính?

Bạn có thể dẫn locateđầu ra cho các lệnh khác. Nếu ví dụ bạn muốn các thuộc tính tệp bạn có thể sử dụng:

$ locate mail-transport-agent.target | xargs stat
  File: '/lib/systemd/system/mail-transport-agent.target'
  Size: 473         Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d   Inode: 667460      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
 Birth: -

Tóm lược

Tôi đã đăng câu trả lời này để cho thấy tốc độ và dễ sử dụng locate. Tôi đã cố gắng giải quyết một số lệnh ngắn được chỉ ra bởi những người khác.

Các findlệnh cần phải đi qua toàn bộ cấu trúc thư mục để tìm tập tin. Các locatelệnh có cơ sở dữ liệu riêng của nó mang đến cho tốc độ rất nhanh nó trong so sánh.


@EliahKagan Nhưng lệnh find đã cuộn qua và liệt kê tất cả các thư mục và tệp trên tất cả các ổ đĩa một phân vùng. Nó dường như đang hoạt động và tôi đã mong đợi một bản in vào cuối ... Dù bằng cách nào thì nó cũng không phải là "sửa chữa" tìm kiếm của lệnh find mà là về thời gian. Chạy locate / display-auto-brightnessmất 17 giây và cũng hiển thị mọi thư mục và tệp trên tất cả các đĩa.
WinEunuuchs2Unix

@EliahKagan Tôi hiểu. --regexlà cần thiết vì có quá nhiều kết quả được trả về với chuỗi tìm kiếm của tôi. Tôi sẽ tìm thấy hai ví dụ mới để tìm và định vị và cập nhật câu trả lời của tôi trong vài phút.
WinEunuuchs2Unix

1
Để làm rõ quan điểm của Eliah, findlệnh đó có nghĩa là "in tên tệp của tất cả các tệp trong thư mục /display-auto-brightness." Tôi nghĩ bạn có ý định sử dụng find / -name display-auto-brightness, nhưng ngay cả điều đó cũng in rất nhiều lỗi "Quyền bị từ chối".
wjandrea

@wjandrea Có như tôi đã nói điểm không tìm thấy tệp, đó là thời gian lệnh find. Bây giờ tôi đang chạy thử nghiệm với các tham số hợp lệ sau khi xóa bộ đệm. Sau đó, tôi sẽ cập nhật câu trả lời.
WinEunuuchs2Unix

1
@Win Không, ví dụ của bạn vẫn hợp lệ và tôi không nghĩ thời gian xử lý bị thay đổi nhiều cho dù tập tin có được tìm thấy hay không.
wjandrea
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.