विकल्प खोजने के लिए? [बन्द है]


30

क्या findअधिक पारंपरिक सीएलआई इंटरफेस के साथ एक वैकल्पिक कार्यक्रम है? findकाम करता है और सबसे अन्य बर्तनों से अलग तरीके से मापदंडों की अपेक्षा करता है।

स्पष्टता: मैं एक ऐसे प्रोग्राम की तलाश में हूं, जिसमें अधिकतर एक ही प्रकार की कार्यक्षमता हो, जो एक कमांडलाइन इंटरफेस के साथ मिल जाए, जो काम करता है और पॉसिक्स (या कम से कम जीएनयू) कमांडलाइन सिफारिशों की तरह लगता है।


7
GNU कमांड लाइन के लिए POSIX (या यहां तक ​​कि GNU) दिशानिर्देशों का सम्मान नहीं करता है। उदाहरण के लिए, मापदंडों का क्रम, एकल डैश के साथ बहु-चरित्र विकल्प आदि, अनुरूप कार्यक्रमों की तुलना में अलग हैं।
तमसे सजेले

3
मुझे पता है, और मैं हमेशा वही कर सकता हूं जो मैं चाहता हूं, एक ही रास्ता या दूसरा। मुझे अभी हाल ही में पता चला है ackऔर सोच रहा था कि क्या और भी बेहतर है find
तमसे सजेले

2
नहीं। आप देखें, मैं एक छोटी प्रोग्रामिंग भाषा नहीं चाहता, लेकिन एक सरल, अधिक सहज और अधिक सुसंगत खोज (भले ही इसका मतलब है कि कुछ उन्नत कार्यक्षमता का नुकसान)। जब मुझे एक कार्य का सामना करना पड़ता है जो एक कार्यक्रम लिखने का औचित्य साबित करता है, तो मैं करता हूं।
तमसे सजेलेई

2
खोज दोनों सुसंगत (मेरा उत्तर देखें) और सहज है। ऐसा नहीं है कि प्राइमरी को अजीब नाम दिया गया है। -exec का अर्थ है निष्पादित, -प्रिंट का अर्थ है इसे प्रिंट करें, -नाम का अर्थ है एक नाम से मेल खाना। व्यवहार में, पूर्व 3 और -Type उपयोग मामलों के 95% को कवर करता है। अन्य सभी मामलों के लिए, वहाँ आदमी है।
मेल

3
@tamas मैंने एक घंटे पहले संपादित किया था और आपको बताया कि इसके अलावा कोई विकल्प नहीं है। और शायद ls -R इसके बारे में सोचते हैं। अन्य विकल्प GUI प्रोग्राम हैं जो खोज का अनुकरण करते हैं। अन्यथा आपको यह निर्दिष्ट करना होगा कि आप अपना खोज विकल्प क्या चाहते हैं। दिर के पेड़ चलो? फ़ाइल नाम फ़िल्टर करें? आपको बताएं कि कौन सी फाइल नई है?
मेल

जवाबों:


11

यह एक आम धारणा है।

विकल्प सिंटैक्स का अनुसरण करें। आप विकल्पों के साथ अभिव्यक्ति प्राइमरी को भ्रमित कर रहे हैं:

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

विकल्प का पता लगाना है। लेकिन अपने स्वयं के अभिव्यक्ति सिंटैक्स को लागू करें क्योंकि यह फ़िल्टर और कार्रवाई विकल्पों का एक समृद्ध सेट प्रदान करता है। ऐसा कोई विकल्प नहीं है जो ऐसा कर सके, सिर्फ इसलिए कि यह बेमानी होगा।


5
यहां तक ​​कि अगर यह मेरी गलती है, तो यह मेरे सवाल का जवाब नहीं देता है।
तमसे सजेलेई

अभिव्यक्ति के बीच अंतर क्या है (केवल एक ही अनुमति दी गई है?), Cmd (dito?), विकल्प और args।
उपयोगकर्ता अज्ञात

@user अज्ञात - खोज आदेश लागू करता है यह स्वयं का अभिव्यक्ति वाक्यविन्यास है। अभिव्यक्ति, जब दिया जाता है, कमांड लाइन पर अंतिम तर्क है। अनुपस्थित होने पर, अभिव्यक्ति -प्रिंट में हल हो जाती है।
मेल

आह - अब मैं देख रहा हूँ, [cmd] [एक्सप्रेशन] का पालन नहीं कर रहा है, लेकिन यह पहले की लाइन का विवरण है।
उपयोगकर्ता अज्ञात

2
ओपी का दावा है कि find"अधिकांश अन्य बर्तनों से अलग तरीके से मापदंडों की उम्मीद है"। आप कहते हैं कि ओपी "विकल्प के साथ अभिव्यक्ति प्राइमरी को भ्रमित कर रहा है"। क्या अधिकांश अन्य बर्तनों में भी "अभिव्यक्ति प्राइमरी" की अवधारणा है? यदि नहीं, तो वह ओपी बिंदु को प्रदर्शित नहीं करता है ? और यह वास्तव में उपयोग करने का सबसे अजीब हिस्सा नहीं है find। अन्य सीएलआई में क्या शामिल है {}(कौन सा कोर्स किसी तरह बच जाना चाहिए)?
काइल स्ट्रैंड

10

यह उस सटीक कार्यक्षमता पर निर्भर करता है जिस पर findआप भरोसा कर रहे हैं। यदि यह (मुख्य रूप से) खोज की कार्यक्षमता है, तो कुछ गोले पुनरावर्ती ग्लब्स का समर्थन करते हैं। जैसे, साथ 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 में ग्लोब क्वालिफायर (अंत के करीब देखो man zshexpn) के माध्यम से बहुत अधिक खोज जैसी संभावनाएं हैं । उदाहरण के लिए:

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

बैश 4 में भी है **/(आपको इसे सक्षम करने की आवश्यकता है shopt -s globstar), लेकिन ग्लोब क्वालिफायर जैसा कुछ भी नहीं है।


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, तो यह नहीं होगा।

एक नकारात्मक पहलू है, हालांकि: यह एक डेटाबेस की जरूरत है। जब चीजें बदलती हैं तो इस डेटाबेस को अपडेट किया जाना चाहिए। मेरे फेडोरा 13 इंस्टॉलेशन ने इसे एक रोज़ कॉन्टैब में डाल दिया है, हालाँकि।


मैं प्यार करता हूँlocate
एंड्रयू लैम्बर्ट

1
इसके अलावा, पैटर्न को भी स्वीकार करें (मैंने इसे हाल ही में सीखा है)।
एडम ब्रीटेक

5

आप क्या खोजने की कोशिश कर रहे हैं? यदि आप आमतौर पर स्रोत कोड फ़ाइलों की खोज कर रहे हैं, तो देख लें ack। यह मूल रूप से एक सोर्स कोड सर्च टूल है, लेकिन ack के -fस्विच में फाइल्स से मेल खाने वाली फाइल्स मिलेंगी।

इसलिए यदि आप एक निर्देशिका में सभी पर्ल फाइलें ढूंढना चाहते हैं, उदाहरण के लिए, बस:

ack -f --perl

यदि आप उन फ़िल्टरों को पसंद नहीं करते हैं जिन्हें एएसी पहचानता है, तो आप अपने आप को अपने में जोड़ सकते हैं ~/.ackrc

ack एक सामान्य-उद्देश्य वाली फ़ाइल खोजक नहीं है find, लेकिन यदि आप स्रोत कोड के साथ काम कर रहे हैं, तो यह बहुत उपयोगी हो सकता है।


1
यह वह नहीं है जो उपयोगकर्ता ने पूछा था, लेकिन स्रोत कोड (जैसे grep) में खोजने के लिए लोगों को बहुत उपयोगी मिल सकता है द सिल्वर सर्चर , अन्य डिस्ट्रोसsilversearcher-ag पर पैकेज।
पाब्लो ए

-1

प्रत्येक प्रोग्रामर को जो चीजें सीखनी चाहिए उनमें से एक है: यदि आपको कोई टूल नहीं मिल रहा है, तो अपना खुद का निर्माण करें!

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

मैं एक बेहतर लिख सकता हूं, -tफ़िल्टर प्रकारों के साथ, आदि।

संपादित करें : ऊपर एक बैश स्क्रिप्ट है। यह कमांड लाइन तर्क लेता है और इसे -name विकल्प के मान के रूप में खोजने के लिए इसे पास करता है। बस एक सरल उदाहरण है। जब से मैंने यह उत्तर दिया, मुझे यह अजगर की स्क्रिप्ट मिली:

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

इंटरफ़ेस अच्छा लग रहा है, लेकिन मैंने इसके प्रदर्शन का परीक्षण नहीं किया है। हो सकता है इसे देखना महंगा न पड़े।


1
अपने टूल स्टेटमेंट के निर्माण के लिए सही है। लेकिन कम से कम यह बताएं कि आपकी छोटी स्क्रिप्ट को कैसे काम करना चाहिए।
जिप्पी

1
$<मेरे बैश में कुछ उपयोगी नहीं कर रहा है। आप इसे करने के लिए क्या उम्मीद करते हैं? क्या आपका मतलब "$@"वास्तव में है? या "$1"(जो मूल रूप से मेकफाइल में इसका क्या अर्थ है)?
ट्रिपलआई

1
@tripleee - $<के cshबराबर है read- मुझे लगता है कि वह इसका मतलब है।
डार्कहार्ट

-2

यूनिक्स में चीजों को खोजने का सबसे मानक तरीका।

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

1
grep | awkएक एंटीपैटर्न है। का बेकार उपयोगgrep देखें । यदि आप पैटर्न को du -a | awk -v "pat=<pattern>" '$0 ~ pat { print $2 }'
परिमार्जित

@tripleee कि के बारे में बहुत उपयोगी जानकारी है awk, लेकिन यूनिक्स दर्शन के महान लाभ में से एक है कि एक सब (जैसे अधिक जटिल उपकरणों की सुविधाओं को समझने की जरूरत नहीं है awkऔर findनिर्माण पाइपलाइनों कि वांछित प्रदर्शन कर सकते हैं करने के लिए) के क्रम में कार्य। grep | awkहो सकता है कि इष्टतम (या, एक उच्च अनुकूलित के साथ एक परफॉर्मेंट मल्टीथ्रेडेड सिस्टम पर grep, शायद यह होगा!), लेकिन यह सरल है
काइल स्ट्रैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.