कमांड प्राप्त करें: मामले को कैसे अनदेखा करें?


170

मैं एक विशाल निर्देशिका पदानुक्रम में "WSFY321.c" फ़ाइल की तलाश कर रहा हूं।
आमतौर पर मैं GNU खोज का उपयोग find . -name "WSFY321.c"
करता हूं : लेकिन मुझे इस मामले की जानकारी नहीं है, यह अपरकेस, लोअरकेस या दोनों का मिश्रण हो सकता है।

इस फ़ाइल को खोजने का सबसे आसान तरीका क्या है?
क्या इससे बेहतर कुछ है find . | grep -i "WSFY321.c"?

जवाबों:


214

जीएनयू के हाल के संस्करणों में मामला-असंवेदनशील नाम खोजों के लिए findएक -inameझंडा है।

find . -iname "WSFY321.c"

6
इसके अलावा, जब से आप विशेष रूप से एक फ़ाइल की तलाश में हैं, तो आप संभवत:-type f झंडे के साथ एक और जोड़ी को दाढ़ी बना सकते हैं ताकि यह नाम देखने में परेशान न हो अगर इनोड एक निर्देशिका है। लेकिन यह अनुकूलन का पांडित्य स्तर है ...
शादुर

कुछ रेगेक्स के साथ काम करने के लिए आप कर सकते हैंfind . -iname \*WSFY321.c\* -type f
बेंज

40

GNU खोजने या खोजने के अन्य संस्करणों के साथ:

find . -iname 'WSFY321.c'

अन्य संस्करणों के साथ:

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

या एक समझौता जो धीमा है लेकिन टाइप करना आसान है:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

या zsh में:

print -rl -- **/(#i)WSFY321.c

@Gillesgrep संस्करण केवल अपर केस को छानने है, और मैं '[^ /]' .. (नहीं /) समझ में नहीं आता
Peter.O

@ गिल्स प्रथम उद्धरण (सटीक फ़ाइल नाम) में एकल उद्धरणों का उपयोग करने का क्या तर्क है?
बर्नहार्ड

@ पीटर । बैश संस्करण के *बाद नहीं /। मेरा मतलब था grep -i। मैं [^/]*इसके बजाय .*निर्देशिकाओं में फ़ाइलों को पकड़ने के लिए उपयोग करता हूं जिनके नाम से शुरू होता है WSFY
गाइल्स

5
@ बर्नहार्ड संगति।
गाइल्स

धन्यवाद गाइल्स: मैंने पिछली टिप्पणी को गलत सिंटैक्स के साथ हटा दिया, और संशोधित संस्करण का परीक्षण किया, लेकिन यह बिना * (एक अप्रत्याशित कारण के, मेरे लिए कम से कम) के बिना काम नहीं करता है। केस-संवेदी विकल्प अब काम करता है: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... मुझे लगता है कि यही कारण है कि यह एक कहा जाता है nocase ग्लोब : यह केवल एक ग्लोब के संदर्भ में काम करता है (या तो ऐसा लगता है)।
पीटर।

1

MacOS के लिए दो समाधान:

GNU का उपयोग करना find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

GNU का उपयोग करना sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

1
MacOS पर Sierra -iname विकल्प डिफ़ॉल्ट रूप से उपलब्ध है।
थॉमसडब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.