"खोजें: रास्तों को अभिव्यक्ति से पहले होना चाहिए:" मैं एक पुनरावर्ती खोज को कैसे निर्दिष्ट करूं जो वर्तमान निर्देशिका में फाइलें भी ढूंढता है?


235

मैं एक मुश्किल समय हो रही हो रहा है खोजने के मौजूदा निर्देशिका में मैचों के साथ-साथ उसकी उप-देखने के लिए।

जब मैं find *test.cइसे चलाता हूं तो मुझे केवल वर्तमान निर्देशिका में मैच मिलते हैं। (उपनिर्देशिकाओं में नहीं दिखता है)

अगर मैं कोशिश करता find . -name *test.cहूं तो मैं वही परिणाम की उम्मीद करूंगा, लेकिन इसके बजाय यह मुझे केवल एक मैच देता है जो एक उपनिर्देशिका में है। जब ऐसी फाइलें होती हैं जो वर्किंग डायरेक्टरी में मेल खाती हैं, तो यह मुझे देती हैं:find: paths must precede expression: mytest.c

इस त्रुटि का क्या मतलब है, और मैं वर्तमान निर्देशिका और इसके उपनिर्देशिका दोनों से कैसे मैच प्राप्त कर सकता हूं?


4
रिकार्ड के लिए, findकी msysgit इस त्रुटि फेंक कर सकते हैं जब तक आप उद्धरण के साथ पैटर्न के चारों ओर: find . -name "*test.c"। (यदि आप इसे विंडोज से अधिक पसंद करना चाहते हैं, तो find.execmd से अलग और उपयोग करें)
n611x007

जवाबों:


393

इसे उद्धरणों में डालने का प्रयास करें - आप शेल के वाइल्डकार्ड विस्तार में चल रहे हैं, इसलिए आप जो खोजने के लिए एकांत में जा रहे हैं वह इस तरह दिखाई देगा:

find . -name bobtest.c cattest.c snowtest.c

... सिंटैक्स त्रुटि के कारण। इसलिए इसके बजाय यह प्रयास करें:

find . -name '*test.c'

अपनी फ़ाइल अभिव्यक्ति के आसपास के एकल उद्धरणों पर ध्यान दें - ये आपके वाइल्डकार्ड्स का विस्तार करने वाले शेल (बैश) को रोक देंगे।


15
उदाहरण के माध्यम से, आप देख सकते हैं कि क्या हो रहा है यदि आप करते हैं echo *test.c... परिणाम वाइल्डकार्ड का विस्तार गूंज नहीं होगा, लेकिन स्वयं शेल। यदि आप वाइल्डकार्ड का उपयोग कर रहे हैं, तो सरल सबक यह है कि फ़िलेस्पेक को कोट करें
क्रिस जे

इस चेतावनी के साथ मेरी मदद करने के लिए धन्यवाद। मैंने find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’वेब पर पाए जाने की कोशिश की , और "पथ पूर्व अभिव्यक्ति चाहिए" के साथ मुलाकात की। समस्या यह थी कि उद्धरण चिह्न बहुत "स्मार्ट" थे। मैंने कमान वापस ले ली, जिससे उद्धरणों को प्रतिस्थापित किया गया, और यह चला।
स्मंदोली

2
किसी कारण से मेरे लिए एकल उद्धरण काम नहीं आया। मुझे दोहरे उद्धरण चिह्नों का उपयोग करना था। ¯ \ _ (ツ) _ / ¯
प्लंके

वाइल्डकार्ड खोजों के लिए सिंगल कोट्स बिजीबॉक्स और जीएनयू के साथ काम करते हैं find- यदि वाइल्डकार्ड का उपयोग *.$variableकरने पर आपको दोहरे उद्धरण चिह्नों की आवश्यकता होती है।
स्टुअर्ट कार्डाल

@Planky: मैंने डाला: शेल स्क्रिप्ट फ़ाइल में -'नाम 'लिखना.लोक' लेकिन इसमें यह त्रुटि संदेश है। लेकिन अगर मैं कंसोल में टाइप करता हूं, तो यह काम करता है। किसी को पता है क्यों?
स्कॉट चू

28

क्या हो रहा है कि शेल फाइलों की एक सूची में "* test.c" का विस्तार कर रहा है। तारांकन से बचने का प्रयास करें:

find . -name \*test.c

#itbash यह मेरे लिए घोड़ों की पिटाई के साथ समाधान था, यहां तक ​​कि जब PATTERN के हवाले सेfind . -name '*txt'
एक अलग बेन

17

इसे उद्धरणों में डालने का प्रयास करें:

find . -name '*test.c'

13

मैनुअल खोजें:

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print

0

मुझे यह सवाल तब आया जब मैं कई फ़ाइलनामों को खोजने की कोशिश कर रहा था जिन्हें मैं @Chris J के उत्तर में वर्णित एक नियमित अभिव्यक्ति में जोड़ नहीं सकता था, यहाँ मेरे लिए काम किया गया है

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-oया -orतार्किक OR है। अधिक जानकारी के लिए Gnu.org पर फाइल्स फाइल्स देखें ।

मैं इसे साइगविन पर चला रहा था।


-1

मेरे मामले में मैं /पथ में अनुगामी गायब था ।

find /var/opt/gitlab/backups/ -name *.tar

1
अनुगामी /की आवश्यकता नहीं है।
melpomene
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.