Thay thế để tìm? [đóng cửa]


30

Có một findchương trình thay thế với giao diện CLI thông thường hơn không? findhoạt động và mong đợi các tham số theo một cách khác nhau đau đớn từ hầu hết các dụng cụ khác.

Làm rõ: Tôi đang tìm kiếm một chương trình có hầu hết chức năng tương tự như tìm kiếm với giao diện dòng lệnh hoạt động và cảm thấy giống như các khuyến nghị về dòng lệnh POSIX (hoặc ít nhất là GNU).


7
GNU find không tôn trọng hướng dẫn POSIX (hoặc thậm chí GNU) cho dòng lệnh. Ví dụ, thứ tự các tham số, tùy chọn nhiều ký tự với một dấu gạch ngang, vv khác với các chương trình tuân thủ.
Tamás Szelei

3
Tôi biết, và tôi luôn có thể làm những gì tôi dự định, bằng cách này hay cách khác. Gần đây tôi mới biết ackvà tự hỏi liệu có tốt hơn không find.
Tamás Szelei

2
Không. Bạn thấy đấy, tôi không muốn một ngôn ngữ lập trình nhỏ, nhưng tìm kiếm đơn giản hơn, trực quan hơn và nhất quán hơn (ngay cả khi điều đó có nghĩa là mất một số chức năng nâng cao). Khi tôi đối mặt với một nhiệm vụ biện minh cho việc viết một chương trình, tôi sẽ làm.
Tamás Szelei

2
tìm là cả nhất quán (xem câu trả lời của tôi) và trực quan. Nó không giống như bầu cử sơ bộ được đặt tên kỳ lạ. -exec có nghĩa là thực thi, -print có nghĩa là in nó, -name có nghĩa là khớp với tên. Trong thực tế, 3 và -type trước đây bao gồm 95% các trường hợp sử dụng. Đối với tất cả các trường hợp khác, có người đàn ông tìm thấy.
Mel

3
@tamas Tôi đã chỉnh sửa một giờ trước và nói với bạn rằng không có sự thay thế nào ngoại trừ xác định vị trí. Và có lẽ tôi sẽ nghĩ về nó. Các lựa chọn thay thế khác là các chương trình GUI mô phỏng tìm thấy. Nếu không, bạn phải xác định những gì bạn muốn tìm thay thế để làm. Đi bộ cây dir? Lọc tên tập tin? Cho bạn biết tập tin nào mới hơn sau đó?
Mel

Câu trả lời:


11

Đây là một quan niệm sai lầm phổ biến.

Tìm theo cú pháp tùy chọn. Bạn chỉ nhầm lẫn giữa các biểu thức với các tùy chọn:

 find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
 [cmd][-->        options          <--] [--> arg0..argN  <--]

Thay thế là xác định vị trí. Nhưng find thực hiện cú pháp biểu thức riêng của nó bởi vì nó cung cấp một tập hợp các tùy chọn bộ lọc và hành động phong phú hơn. Không có sự thay thế nào có thể làm tương tự, đơn giản vì nó sẽ là dư thừa.


5
Ngay cả khi đó là lỗi của tôi, điều này không trả lời câu hỏi của tôi.
Tamás Szelei

Sự khác biệt giữa biểu thức (chỉ cho phép một?), Cmd (dito?), Tùy chọn và đối số là gì?
người dùng không xác định

@user unknown - lệnh find thực hiện cú pháp biểu thức riêng của nó. Biểu thức, khi được đưa ra, là đối số cuối cùng trên dòng lệnh. Khi vắng mặt, biểu thức giải quyết thành -print.
Mel

À - bây giờ tôi thấy, [cmd] không theo [biểu thức], nhưng đó là mô tả về dòng trước đây.
người dùng không biết

2
OP khẳng định rằng find"mong đợi các thông số theo cách khác biệt với hầu hết các tiện ích khác". Bạn nói rằng OP là "nguyên tắc biểu thức khó hiểu với các tùy chọn". Có phải hầu hết các dụng cụ khác thậm chí có một khái niệm về "bầu cử sơ bộ"? Nếu không, điều đó không thể hiện quan điểm của OP? Và đó thực sự không phải là phần lạ nhất của việc sử dụng find. Những gì CLI khác liên quan {}(tất nhiên phải được thoát ra bằng cách nào đó)?
Kyle Strand

10

Nó phụ thuộc vào chức năng chính xác findmà bạn đang dựa vào. Nếu đó là (chủ yếu) chức năng tìm kiếm, một số shell hỗ trợ các đệ quy đệ quy. Ví dụ: với zsh:

% find . -name \*c
./a/b/foo.c
./a/bar.c
./baz.c
inoshiro% ls *.c
baz.c
% ls **/*.c 
a/bar.c  a/b/foo.c  baz.c

Zsh có nhiều khả năng giống như tìm kiếm hơn thông qua vòng loại toàn cầu (nhìn gần cuối man zshexpn). Ví dụ:

ls -l **/*(.)  ≈   find -type f -ls
ls *(m-2u:$USER:)  ≈  find -mtime -2 -user $USER

Bash 4 cũng có **/(bạn cần kích hoạt nó shopt -s globstar), nhưng không có gì giống như vòng loại toàn cầu.


10

Tôi sẽ xem xét locate. Nó sẽ xem qua cơ sở dữ liệu của các tệp và nhanh chóng in ra các tên đường dẫn khớp với những gì bạn đưa ra.

kevin@box:~$ locate odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
/usr/share/gimp/2.0/help/en/gimp-tool-dodge-burn.html
....
kevin@box:~$ locate .odg
/home/kevin/Documents/final.odg
/usr/share/doc/packages/sysconfig/netconfig.odg
kevin@box:~$ 

Như bạn có thể thấy, đó là một kết hợp văn bản phụ: nếu bạn đưa ra odg, thì nó sẽ khớp với d odg e. Nhưng nếu bạn cho nó .odg, thì nó sẽ không.

Tuy nhiên, có một nhược điểm: nó cần một cơ sở dữ liệu. Cơ sở dữ liệu này cần được cập nhật khi mọi thứ thay đổi. Mặc dù vậy, bản cài đặt Fedora 13 của tôi đã được đưa vào crontab hàng ngày.


Tôi yêulocate
Andrew Lambert

1
Hơn nữa, định vị cũng chấp nhận các mẫu (tôi mới học được điều này gần đây).
Adam Byrtek

5

Bạn đang cố gắng tìm gì? Nếu bạn thường tìm kiếm các tệp mã nguồn, hãy xem ack. Về cơ bản, đây là một công cụ tìm kiếm mã nguồn, nhưng -fcông tắc của ack sẽ tìm thấy các tệp khớp với một kiểu tệp đã cho.

Vì vậy, nếu bạn muốn tìm tất cả các tệp Perl trong một thư mục, chẳng hạn, chỉ cần:

ack -f --perl

Nếu bạn không thích các kiểu tệp mà ack nhận ra, bạn có thể thêm các tệp của riêng bạn ~/.ackrc.

ack không phải là một công cụ tìm tập tin đa năng như thế find, nhưng nếu bạn đang làm việc với mã nguồn, nó có thể rất tiện dụng.


1
Đây không phải là những gì người dùng đã hỏi nhưng mọi người có thể thấy rất hữu ích để tìm trong mã nguồn (như grep) Trình tìm kiếm bạc , silversearcher-aggói trên các bản chính.
Pablo A

-1

Một trong những điều tuyệt vời mà mọi lập trình viên nên học là: Nếu bạn không thể tìm thấy một công cụ, hãy tự xây dựng!

#!/usr/bin/bash
find -name $<

Tôi có thể viết một cái tốt hơn, với -tcác loại bộ lọc, v.v.

Chỉnh sửa : Trên đây là một kịch bản Bash. Nó nhận đối số dòng lệnh và chuyển nó để tìm làm giá trị của tùy chọn -name. Chỉ là một ví dụ đơn giản. Kể từ khi tôi đưa ra câu trả lời này, tôi đã tìm thấy tập lệnh python này:

https://github.com/sjl/friendly-find/

Giao diện trông đẹp, nhưng tôi chưa kiểm tra hiệu năng của nó. Có thể đáng để kiểm tra.


1
Đúng cho việc xây dựng tuyên bố công cụ riêng. Nhưng ít nhất giải thích cách kịch bản nhỏ của bạn được cho là hoạt động.
jippie

1
$<không làm bất cứ điều gì hữu ích trong Bash của tôi. Bạn mong đợi nó làm gì? Bạn có nghĩa là "$@"thực sự? Hoặc "$1"(về cơ bản điều này có nghĩa là gì trong Makefile)?
tripleee

1
@tripleee - $<cshtương đương read- Tôi đoán ông có nghĩa là.
DarkHeart

-2

Cách tiêu chuẩn nhất để tìm thấy mọi thứ trong unix's.

du -a <directory>|grep <pattern>| awk  '{print $2}'

1
grep | awklà một antipotype. Xem sử dụng vô dụng củagrep . Nếu bạn muốn bán tham số mẫu, có thểdu -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee

@tripleee Đó là thông tin rất hữu ích về awk, nhưng một trong những lợi thế lớn của triết lý UNIX là người ta không cần phải hiểu tất cả các tính năng của các công cụ phức tạp hơn (như awkfind) để xây dựng các đường ống có thể thực hiện mong muốn bài tập. grep | awkcó thể không tối ưu (hoặc, trên một hệ thống đa luồng hiệu suất với tối ưu hóa cao grep, có thể nó sẽ như vậy!), nhưng nó đơn giản .
Kyle Strand
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.