ทางเลือกที่จะหา? [ปิด]


30

มีfindโปรแกรมอื่นที่มีอินเตอร์เฟส CLI แบบเดิมหรือไม่? findทำงานและคาดหวังว่าพารามิเตอร์ในวิธีที่แตกต่างอย่างเจ็บปวดจากอุปกรณ์อื่น ๆ ส่วนใหญ่

ชี้แจง: ฉันกำลังมองหาโปรแกรมที่มีฟังก์ชั่นส่วนใหญ่เหมือนกับค้นหาด้วยอินเตอร์เฟสบรรทัดคำสั่งที่ทำงานและให้ความรู้สึกเหมือนคำแนะนำบรรทัดคำสั่ง POSIX (หรืออย่างน้อย GNU)


7
GNU find ไม่เป็นไปตามหลักเกณฑ์ POSIX (หรือแม้แต่ GNU) สำหรับบรรทัดคำสั่ง ตัวอย่างเช่นการเรียงลำดับของพารามิเตอร์ตัวเลือกหลายตัวละครที่มีเส้นประเดียว ฯลฯ จะแตกต่างจากในโปรแกรมที่สอดคล้อง
Tamás Szelei

3
ฉันรู้และฉันสามารถทำสิ่งที่ฉันตั้งใจได้เสมอไม่ทางใดก็ทางหนึ่ง ฉันเพิ่งได้รู้ackและสงสัยว่ามีดีกว่าfindเช่นกัน
Tamás Szelei

2
ไม่คุณจะเห็นว่าฉันไม่ต้องการภาษาการเขียนโปรแกรมขนาดเล็ก แต่เป็นการค้นหาที่ง่ายกว่าง่ายกว่าและสอดคล้องกว่า (แม้ว่านั่นหมายถึงการสูญเสียฟังก์ชันการทำงานขั้นสูงบางอย่าง) เมื่อฉันเผชิญกับงานที่แสดงให้เห็นถึงการเขียนโปรแกรมที่ฉันทำ
Tamás Szelei

2
พบว่ามีความสอดคล้องกัน (ดูคำตอบของฉัน) และใช้งานง่าย มันไม่เหมือนพรรคที่มีชื่อแปลก ๆ -exec หมายถึง execute, -print หมายถึงพิมพ์มัน -name หมายถึงการจับคู่ชื่อ ในทางปฏิบัติอดีต 3 และ -type ครอบคลุม 95% ของกรณีการใช้งาน สำหรับกรณีอื่น ๆ มีผู้ชายพบ
Mel

3
@tamas ฉันแก้ไขหนึ่งชั่วโมงที่ผ่านมาและบอกคุณว่าไม่มีทางเลือกอื่นนอกจากค้นหา และบางที ls -R ลองคิดดูสิ ทางเลือกอื่น ๆ คือโปรแกรม GUI ที่เลียนแบบการค้นหา มิฉะนั้นคุณต้องระบุสิ่งที่คุณต้องการให้ทางเลือกการค้นหาของคุณทำ เดินต้นไม้ dir? กรองชื่อไฟล์หรือไม่ บอกได้ไหมว่าไฟล์ไหนที่ใหม่กว่า?
Mel

คำตอบ:


11

นี่คือความเข้าใจผิดที่พบบ่อย

ค้นหาตามไวยากรณ์ตัวเลือก คุณแค่สับสนกับการแสดงออกของตัวเลือก:

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

ทางเลือกคือการค้นหา แต่พบว่าใช้ไวยากรณ์การแสดงออกของตัวเองเพราะมันมีชุดตัวกรองและการกระทำที่สมบูรณ์ยิ่งขึ้น ไม่มีทางเลือกอื่นที่สามารถทำสิ่งเดียวกันได้เพียงเพราะมันซ้ำซ้อน


5
แม้ว่าจะเป็นความผิดของฉัน แต่ก็ไม่ตอบคำถามของฉัน
Tamás Szelei

ความแตกต่างระหว่างการแสดงออก (อนุญาตเพียงหนึ่งเดียวคืออะไร), cmd (dito?), ตัวเลือกและ args?
ผู้ใช้ไม่รู้จัก

@ ผู้ใช้ที่ไม่รู้จัก - คำสั่ง find ใช้ไวยากรณ์นิพจน์ของตัวเอง การแสดงออกเมื่อได้รับเป็นอาร์กิวเมนต์สุดท้ายในบรรทัดคำสั่ง เมื่อไม่มีการแสดงออกการแก้ปัญหาการพิมพ์
Mel

อ่า - ตอนนี้ฉันเห็นแล้ว [cmd] ไม่ได้ติดตาม [นิพจน์] แต่เป็นคำอธิบายของบรรทัดก่อนหน้า
ผู้ใช้ที่ไม่รู้จัก

2
OP อ้างว่าfind"คาดว่าพารามิเตอร์จะแตกต่างจากอุปกรณ์อื่น ๆ อย่างเจ็บปวด" คุณระบุว่า OP คือ "สร้างความสับสนให้กับตัวเลือก" สิ่งของอื่น ๆ ส่วนใหญ่มีแนวคิดเรื่อง "การแสดงออกในพรรค" หรือไม่? ถ้าไม่นั่นแสดงให้เห็นถึงจุดของ OP หรือไม่? findและที่จริงไม่ได้เป็นส่วนหนึ่งของการใช้ที่แปลกประหลาด CLI อื่น ๆ เกี่ยวข้องกับอะไร{}(แน่นอนว่าต้องหนีไปไหน)
Kyle Strand

10

ขึ้นอยู่กับการใช้งานที่แม่นยำของfindสิ่งที่คุณวางใจ หากเป็น (โดยหลัก) ฟังก์ชันการค้นหาเชลล์บางตัวสนับสนุน globs แบบเรียกซ้ำ เช่นกับ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 มีมากขึ้นพบว่าเหมือนเป็นไปได้ผ่านรอบคัดเลือก glob (ดูใกล้ปลายman zshexpn) ตัวอย่างเช่น:

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

Bash 4 ยังมี**/(คุณต้องเปิดใช้งานด้วยshopt -s globstar) แต่ไม่มีอะไรที่เหมือนกับ qualifier ของ glob


10

locateฉันจะใช้เวลาดูที่ มันจะตรวจสอบฐานข้อมูลของไฟล์และพิมพ์ชื่อพา ธ ที่ตรงกับสิ่งที่คุณให้ได้อย่างรวดเร็ว

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:~$ 

อย่างที่คุณเห็นมันเป็นการจับคู่ข้อความย่อย: ถ้าคุณให้มันodgแล้วมันจะตรงกับ d odg e แต่ถ้าคุณให้.odgแล้วก็จะไม่

มีข้อเสียอย่างหนึ่งคือ: มันต้องการฐานข้อมูล ฐานข้อมูลนี้จำเป็นต้องได้รับการปรับปรุงเมื่อสิ่งต่าง ๆ เปลี่ยนแปลง อย่างไรก็ตามการติดตั้ง Fedora 13 ของฉันทำให้สิ่งนี้เป็น crontab รายวันได้


ฉันรักlocate
Andrew Lambert

1
ยิ่งกว่านั้นการค้นหาก็ยอมรับรูปแบบ (ฉันเพิ่งเรียนรู้สิ่งนี้เมื่อเร็ว ๆ นี้)
Adam Byrtek

5

คุณพยายามค้นหาอะไร ackหากคุณมักจะค้นหาไฟล์รหัสที่มาดูที่ โดยพื้นฐานแล้วมันเป็นเครื่องมือค้นหาซอร์สโค้ด แต่-fสวิตช์ของ ack จะค้นหาไฟล์ที่ตรงกับประเภทไฟล์ที่กำหนด

ดังนั้นหากคุณต้องการค้นหาไฟล์ Perl ทั้งหมดในไดเรกทอรีตัวอย่างเช่น:

ack -f --perl

~/.ackrcถ้าคุณไม่ชอบประเภทไฟล์ที่แอ๊ตระหนักถึงคุณสามารถเพิ่มของคุณเองในของคุณ

แอ๊ไม่ใช่เครื่องมือค้นหาไฟล์ทั่วไปfindแต่ถ้าคุณทำงานกับซอร์สโค้ดมันจะมีประโยชน์มาก


1
นี่ไม่ใช่สิ่งที่ผู้ใช้ถาม แต่ผู้คนอาจพบว่ามีประโยชน์มากสำหรับการค้นหาในซอร์สโค้ด (เช่น grep) Silver Searcherซึ่งเป็นsilversearcher-agแพคเกจใน distros หลัก
Pablo A

-1

หนึ่งในสิ่งที่ยอดเยี่ยมที่โปรแกรมเมอร์ทุกคนควรเรียนรู้คือ: หากคุณไม่สามารถหาเครื่องมือได้ให้สร้างของคุณเอง!

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

ฉันอาจจะเขียนที่ดีกว่า-tเพื่อกรองประเภท ฯลฯ

แก้ไข : ข้างต้นเป็นสคริปต์ทุบตี ใช้อาร์กิวเมนต์บรรทัดคำสั่งและส่งผ่านเพื่อค้นหาเป็นค่าของตัวเลือก -name เป็นเพียงตัวอย่างง่ายๆ เมื่อฉันตอบคำถามนี้ฉันพบสคริปต์ไพ ธ อนนี้:

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

อินเทอร์เฟซดูดี แต่ฉันไม่ได้ทดสอบประสิทธิภาพ อาจคุ้มค่าที่จะเช็คเอาท์


1
จริงสำหรับการสร้างคำสั่งเครื่องมือของตัวเอง แต่อย่างน้อยก็อธิบายว่าสคริปต์ตัวน้อยของคุณควรทำงานอย่างไร
jippie

1
$<ไม่ได้ทำอะไรที่มีประโยชน์ใน Bash ของฉัน คุณคาดหวังให้ทำอะไร? คุณหมายถึง"$@"จริงเหรอ? หรือ"$1"(ซึ่งโดยทั่วไปแล้วสิ่งนี้มีความหมายอย่างไรใน Makefile)
tripleee

1
@tripleee - $<เป็นcshเทียบเท่าread- ฉันคาดเดาว่าเขาหมายความว่า
DarkHeart

-2

วิธีมาตรฐานที่สุดในการค้นหาสิ่งต่าง ๆ ในยูนิกซ์

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

1
grep | awkเป็น antipattern ดูการใช้งานที่ไร้ประโยชน์ grepหากคุณต้องการทำให้รูปแบบเป็นไปได้หรือไม่du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
tripleee

@tripleee นั่นเป็นข้อมูลที่เป็นประโยชน์มากเกี่ยวกับawkแต่ข้อดีอย่างหนึ่งของปรัชญา UNIX ก็คือเราไม่จำเป็นต้องเข้าใจคุณสมบัติทั้งหมดของเครื่องมือที่ซับซ้อนมากขึ้น (เช่นawkและfind) เพื่อสร้างท่อที่สามารถทำงานได้ตามที่ต้องการ งาน. grep | awkอาจไม่เหมาะสม (หรือบนระบบมัลติเธรด performant กับการเพิ่มประสิทธิภาพสูงgrepบางทีมันอาจจะเป็น!) แต่มันง่าย
Kyle Strand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.