Sử dụng xác định vị trí trên đường dưới một số thư mục cụ thể?


46

Tôi đã tự hỏi làm thế nào để hạn chế phạm vi tìm kiếm của "định vị" vào một số thư mục?

Ví dụ: làm thế nào để tìm các tệp / thư mục có chuỗi "math" trong tên của chúng trong một số thư mục "/ home / tim / khoa học /"?

Cảm ơn và trân trọng!

Câu trả lời:


30

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.

  1. Đầu tiên, mở rộng tên tệp shell sẽ mở rộng trình thu thập mẫu shell đặc biệt * (Điều này là do * không được bảo vệ, tức là không có "dấu ngoặc kép")
  2. Kết quả mở rộng này là một danh sách các tên tệp . có lẽ rất dài ... Danh sách này được truyền cho locatenhiều đối số dòng lệnh riêng lẻ.
  3. 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 /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)

  1. Các -rtù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.
  2. Các dấu ngoặc kép bảo vệ * khỏi mở rộng tên tệp shell. Nó có nghĩa là dấu * và dấu chấm. bây giờ là nhân vật regex đặc biệt
  3. Là regex, bạn có thể rất dễ dàng nói 'định vị' để khớp với mục cơ sở dữ liệu của nó theo nhiều cách khác nhau: eg1. 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

  • Các kết quả khớp "... (regex) được thực hiện đối với toàn bộ tên đường dẫn và do đó, theo mặc định, một tên đường dẫn sẽ được khớp nếu bất kỳ phần nào của nó khớp với biểu thức chính quy định. Biểu thức chính quy có thể sử dụng ^ hoặc $ để neo một kết quả khớp tại bắt đầu hoặc kết thúc tên đường dẫn. "

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\ regexhoặc-/"my regex"

ví dụ. locate -ir ~/".*"la\ bella\ vitalà 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 -bhoặ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 .. Locatequá 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 :) ....


13

Đư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í.


@Adam .. Đừng đánh giá thấp phương pháp của bạn; nó khá ổn, nhưng bạn có thể sử dụng regex của chính xác định vị trí thay vì chuyển sang grep .. Phương pháp "khác" mà bạn đề cập không sử dụng regex và hành xử hoàn toàn khác .... Tôi đã thêm một số chi tiết về sự khác biệt của tôi trả lời ...
Peter.O

2
định vị ít hơn | grep ^ / bin nhanh hơn định vị -r ^ / bin /.* ít hơn, vì định vị ít hơn sẽ thực hiện tìm kiếm hiệu quả cho từ ít hơn và định vị -r sẽ thực hiện thao tác regex trên tất cả các mục trong định vị
Marcel Valdez Orozco

@MarcelValdezOrozco "Tìm kiếm từ hiệu quả" là gì và tại sao nó nhanh hơn regex?
Flashrunner

@Flashrunner Bởi vì locatelàm một O(log(n))tìm kiếm trên locatedbkhi 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.
Marcel Valdez Orozco

@MarcelValdezOrozco Nhưng tại sao tìm kiếm không phải regex qua db là 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?
Flashrunner

8

Bạn có thể sử dụng. locate /rootpath/*filenamespecTô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 findlệnh hơn locatelà 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* -printKhô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.


Đây là câu trả lời tốt nhất vì nó sử dụng locatechí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).
Tom

Công cụ này hoạt động thực sự giống như một bùa mê mà bạn có thể sử dụng định vị để tìm kiếm tệp trong thư mục cụ thể Đường dẫn, cảm ơn @Nerdfest
amit_game 15/03/2016

1

Đối với tôi thuận tiện nhất là

cd /home/tim/science
locate math | grep `pwd`

Bạn đã thực sự đọc câu hỏi?
Tessaracter
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.