मुझे * main.o क्यों मिल सकता है लेकिन * .o नहीं?


19

यह एक सही है:

$ find . -name *main.o
./main.o

तो, मुझे क्यों नहीं मिल रहा है *.o?

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]


जिसे आप सही कहते हैं, वह भी गलत है। यदि वर्तमान निर्देशिका में एक मैच और एक उपनिर्देशिका में दूसरा मैच है, तो यह तब तक दोनों को खोजने में सक्षम नहीं होगा जब तक कि दोनों का एक ही नाम न हो। यानी आपके पहले उदाहरण में एक फ़ाइल हो सकती है जिसे बुलाया ./sub/domain.oनहीं गया है।
कास्परड

जवाबों:


46

संभवतः एक से अधिक फ़ाइल हैं जो मेल खाती हैं *.o, जबकि केवल एक फ़ाइल मैच करती है *main.o, इसलिए, पहले मामले में, शेल विस्तार चलता है:

$ find . -name main.o

और यह काम करता है। दूसरे मामले में:

$ find . -name file1.o main.o

और इसी वजह से आपको एरर आया।

इसे रोकने के लिए, आपको expressionदोनों आदेशों में उद्धृत करना चाहिए :

$ find . -name '*.o'
$ find . -name '*main.o'

2
दरअसल, कोई भी इसे आसानी से echo *.oबनाम के साथ देख सकता है echo '*.o'
रुस्लान

@Ruslan निर्भर करता है, अगर ग्लोब ( *, ?) बैश से मेल खाती कोई फाइल नहीं है, तो इसे शाब्दिक चरित्र के रूप में माना जाएगा।

@BroSlow निस्संदेह, मैं विशेष स्थिति ओपी में था के बारे में बात कर रहा था।
रुस्लान

16

फ़ाइल पैटर्न को उद्धरणों में रखें। अन्यथा, * शेल द्वारा विस्तार किया गया है (इसे देखने से पहले फ़ाइलों की सूची में हल किया गया है), भ्रामक खोज।

find . -name "*.o"

13
वैकल्पिक रूप से *एक बैकस्लैश के साथ बच :find -name \*.o
डेविड फ़ॉस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.