kết hợp regex với xác định vị trí


8

Tôi đang cố gắng sử dụng lệnh định vị để tìm tệp trong thư mục nhà của mình, tuy nhiên bất cứ khi nào tôi thử và chạy nó, tôi không nhận được kết quả:

locate -i -l 4 --regexp '^\/home\/jack\/[A-Za-z0-9\/\ ]*(My.)*$'

Tôi cũng đã thử ^\/home\/jack\/^(?!\.)[A-Za-z0-9\/\ ]*(My.)*$nhưng điều đó cũng không mang lại kết quả.

Các tập tin tôi đang tìm kiếm chỉ để kiểm tra nó là /home/jack/Music/Foals/My Number.flac

Tôi muốn loại trừ kết quả của các tập tin ẩn khỏi tìm kiếm của tôi.


2
Tôi không quen thuộc locate. Liệu có hợp lý không khi kết hợp -b(nghĩa là "Chỉ khớp tên cơ sở với các mẫu đã chỉ định.") Với một đường dẫn trong --regexp? Tại sao bạn thoát khỏi /s?
Hauke ​​Laging

Xin lỗi, tôi đã sử dụng trình xây dựng regex khuyên tôi thoát khỏi các ký tự đó và tôi đoán bạn đúng về cờ -b, tôi sẽ thoát khỏi nó ngay bây giờ
Jack Jones

1
Phải (My.)*làm gì đây? My.*$làm. Bạn phải thoát ()trong REs cơ bản.
Hauke ​​Laging

1
Bạn đang sử dụng một regex mở rộng. Nhưng --regexpcó một regex cơ bản. Hãy thử đổi --regexpthành --regex(không p). Trang người đàn ông nói --regexkhông phù hợp với regex mở rộng.
Mikel

Câu trả lời:


6

Điều này dường như để làm công việc.

locate -ir '^/home/jack/\([^.][^/]\+/\)\+My[^/]*$'

Trích dẫn từ hướng dẫn sử dụng:

-i, --ignore-case Bỏ qua sự phân biệt trường hợp khi khớp mẫu.

-r, --regex REGEXP Tìm kiếm một REGEXP regrec cơ bản. Không được phép THỰC HIỆN nếu tùy chọn này được sử dụng, nhưng tùy chọn này có thể được chỉ định nhiều lần.


Trong Linux, mlocate 0.26-1ubfox2 (Ubuntu 16.04 LTS Xenial Xerus, kể từ 2018-02-05), lệnh trả về lỗi sau "xác định vị trí: các đối số không tùy chọn không được phép với --regrec". mlocate là gói thực tế (/ usr / bin / xác định vị trí là một liên kết tượng trưng cho mlocate).
Hans Deragon

1

Cách xác định vị trí công trình

Thông thường, chỉ mục của các tệp mà locatelệnh sử dụng chỉ được xây dựng lại một lần một ngày. Nó được xây dựng bởi công việc định kỳ này /etc/cron.daily/mlocate. Vì vậy, các mục của bạn có khả năng chỉ là chưa có. Bạn có thể chạy lại nó nếu bạn muốn nó tự xây dựng lại các chỉ mục này.

$ sudo /etc/cron.daily/mlocate

Sử dụng tìm

Tuy nhiên, có lẽ bạn nên sử dụng một lệnh như findđể xác định vị trí các tệp trong thư mục chính của bạn.

$ find ~ -iname "[^.]*" | head -10
/home/saml
/home/saml/isql_issue.txt
/home/saml/bbbb
/home/saml/script_name.sh
/home/saml/go_figure_book
/home/saml/go_figure_book/readme.txt
/home/saml/go_figure_book/lstopo.txt
/home/saml/go_figure_book/who_breaks_out.bash
/home/saml/hdat2
/home/saml/hdat2/hdat2_v50.iso

Sử dụng GUI

Bạn cũng có thể quan tâm đến một công cụ tìm kiếm đồ họa. Hãy xem câu hỏi và trả lời khác của U & L có tiêu đề: GTK Frontend để xác định vị trí bao gồm một công cụ như vậy gọi là Catfish. Công cụ này có thể sử dụng cả locatedữ liệu cũng như findcác lệnh.


1
Tôi thường tìm thấy locatenhanh hơn findngay cả khi tôi phải làm updatedbtrước. Miễn là cơ sở dữ liệu đã được cập nhật hợp lý trên hầu hết các hệ thống updatedbsẽ không mất nhiều thời gian. Tìm cú pháp có lẽ dễ dàng hơn trong trường hợp này mặc dù.
Graeme

Vâng, tôi cũng đã sử dụng nó hàng ngày, nó chỉ trên các máy chủ mà tôi đang viết kịch bản mà tôi thường chuyển sang find.
slm

Vâng, đáng lẽ phải đặt 'hầu hết các hệ thống máy tính để bàn'
Graeme

1

Bạn cũng có thể có một cách tiếp cận khác:

locate "My file" | grep '/home/jack' | grep -v '/\.'

Tôi không chắc chắn những gì bạn đang cố gắng làm. Bạn đang sử dụng -ilá cờ để làm cho nó phân biệt dạng chữ và regex của bạn không phải là rất cụ thể, bạn dường như muốn đầu để tìm tất cả các file hoặc thư mục đang được /home/jackvà có chứa MY, My, my, hoặc mYbất cứ nơi nào trong tên tập tin. Nếu vậy, chỉ cần chạy

locate -i my | grep '/home/jack' | grep -v '/\.'

0

Điều này sẽ hoạt động - chỉ khớp với các tệp và thư mục không bị ẩn:

find /home/jack -name "[^.]*My.*"

thậm chí đơn giản hơn - điều này khớp với các tệp không có thư mục ẩn ở bất kỳ đâu trong cây thư mục. Có lẽ đây là những gì bạn muốn:

for f in /home/jack/**/*My.*
    do echo "$f" # or do any other command
done

Tôi thích sử dụng hơn locate, vì tôi đang cố gắng tích hợp nó vào GUI Python để tìm kiếm khi bạn nhập và nó nhanh hơn. Nhưng dù gì cũng cảm ơn!
Jack Jones

@JackJones bạn thậm chí không cần locatephải tăng tốc kết quả. Ví dụ:echo /home/jack/**/*My.*
jayhendren
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.