Câu trả lời:
CẬP NHẬT : Một lưu ý về việc sử dụng tùy chọn regex của định vị so với mở rộng tên tệp của shell liên quan đến đối số của ...
MỞ RỘNG PHIM MỞ RỘNG
Khi bạn nhập locate /bin/b*
(lưu ý không có dấu ngoặc kép), một số điều xảy ra.
locate
nhiều đối số dòng lệnh riêng lẻ. locate
sau đó kiểm tra từng đối số này với từng tệp trong cơ sở dữ liệu của nó và xuất ra kết quả khớp. Tuy nhiên, hãy lưu ý rằng 'định vị' không có khái niệm về thư mục làm việc hiện tại. Nó chỉ phù hợp với đối số của bạn so với tên tệp đủ điều kiện trong cơ sở dữ liệu của nó.
Điều này có nghĩa là nó sẽ phù hợp với cả hai /bin/bash
và /home/user/bin/brackets
Bạn có một số mức độ kiểm soát theo cách này, nhưng tìm kiếm regex của định vị cung cấp nhiều hơn; cũng như một số tùy chọn khác của định vị.
LỰA CHỌN ĐĂNG KÝ CỦA ĐỊA PHƯƠNG
Khi bạn nhập locate -r "/bin/b.*"
những điều khác nhau xảy ra so với thực hiện với các đối số đơn giản .. ( shell-extend-args chỉ là một danh sách các đối số đơn giản)
-r
tùy chọn bảo xác định vị trí để điều trị arg của bạn như là một mô hình regex. locate -r "^/bin/b.*"
tạo tên tệp bắt đầu bằng / bin / b ... eg2. locate -r ~/"bin/b.*"
tạo tên tệp bắt đầu bằng / home / user / bin / b .. Lưu ý rằng ~ / không được bảo vệ bởi "dấu ngoặc kép" và do đó phải chịu sự mở rộng của dấu ngã , chuyển đổi ~ / thành / home / user / Tóm tắt: "mở rộng tên tệp shell" khá khác với 'regex'
Bây giờ trở lại bài viết gốc:
locate
thường liệt kê toàn bộ cơ sở dữ liệu vào thiết bị xuất chuẩn, vì vậy để giới hạn nó trong một thư mục cụ thể, bạn cần lọc nó ... Bạn có thể thực hiện việc này thông qua các tùy chọn định vị.
Bạn có thể sử dụng khả năng regex của định vị, thay vì chỉ toàn cầu ... ( locate /dir/myfile*
là toàn cầu) ...
Từ thông tin xác định vị trí : -r
,--regex
lưu ý: -i = bỏ qua trường hợp
. . . . . -r = regex
. . . . . ~ / sẽ được mở rộng bởi trình bao tới / home / user (khi ~ / không có trong ngoặc kép)
. . . . . '\' (baskslash + dấu cách; không có dấu ngoặc kép) là khoảng trắng theo nghĩa đen (để tránh mở rộng vỏ). Bạn có thể đặt chuỗi trong dấu ngoặc kép, nhưng hãy chắc chắn để lại dấu ~ / bên ngoài dấu ngoặc kép: ~/my\ regex
hoặc-/"my regex"
ví dụ. locate -ir ~/".*"la\ bella\ vita
là giống như locate -ir ~/".*la bella vita"
và sẽ tìm kiếm toàn bộ thư mục nhà của bạn cho "La Bella Vita" xảy ra ở bất cứ đâu.
Bạn cũng có thể giới hạn tìm kiếm chỉ tên tệp nhưng sử dụng -b
hoặc --basename
.. trong trường hợp đó, dòng bắt đầu regex ^
chỉ áp dụng cho tên cơ sở ...
Tôi thường thấy mình sử dụng locate -bir
PS .. Locate
quá nhanh, đến nỗi tôi chưa bao giờ sử dụng find
... tôi cũng chưa sử dụng tìm kiếm nautilus (quá chậm)
Với 'định vị', nếu bạn đang tìm kiếm thứ gì đó mới được thêm vào, chỉ cần chạy sudo updatedb
để làm mới cơ sở dữ liệu của ... ... nhưng nếu bạn mới thêm nó, bạn có thể biết nó ở đâu :) ....
Đưa nó qua grep, như thế này
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
Chỉnh sửa: Câu trả lời khác là tốt hơn, tôi không biết bạn có thể vượt qua một mô hình để xác định vị trí.
locate
làm một O(log(n))
tìm kiếm trên locatedb
khi bạn cung cấp cho nó một truy vấn tìm kiếm không phải regex, sau đó bạn có thể sử dụng grep
's regex để thực hiện một O(m)
tìm kiếm trên đã giảm tiểu kết quả. (n = tổng số mục trong locatedb
[tức là tất cả các tệp trong ổ đĩa của bạn], m = # các mục nhập ít khớp với bạn locatedb
), tổng độ phức tạp khi chạy:, O(log(n)) + O(m)
trong đó trung bình là m log(n)
, do đó, bạn nhận được 2*O(log(n))
, trái ngược với O(n)
khi bạn thực hiện một truy vấn regex trên tất cả các mục trong locatedb
.
O(log(n))
trong khi tìm kiếm regex là O(n)
? Số lượng mục trong db là như nhau trong từng trường hợp. Tôi đoán đó là thuật toán tìm kiếm?
Bạn có thể sử dụng. locate /rootpath/*filenamespec
Tôi đã không thử nó trước đây, nhưng nó có vẻ hoạt động. Để làm ví dụ của bạn, nó sẽ làlocate /home/tim/science/*math*
Bạn có thể muốn xem find
lệnh hơn locate
là loại hành vi đó. Cú pháp sẽ là find rootforsearch -name filenamepattern -print
. Trong trường hợp này, ví dụ của bạn sẽ yêu cầu. find /home/tim/science -name *math* -print
Không nhanh như định vị vì không có cơ sở dữ liệu để tìm kiếm ... nó thực sự tìm kiếm hệ thống tệp. Có rất nhiều tùy chọn bạn có thể sử dụng ngoài việc in, nếu bạn có ý định thực sự làm gì đó với tệp.
locate
chính nó (không yêu cầu bất kỳ tiện ích nào khác như grep
) và không có regexps (rất hay, nhưng không cần thiết trong trường hợp này).
Đối với tôi thuận tiện nhất là
cd /home/tim/science
locate math | grep `pwd`