कमांड लाइन से फाइल सिस्टम में फाइल कैसे खोजें?


10

मैं फ़ाइल सिस्टम में फ़ाइल (आंशिक रूप से ज्ञात फ़ाइल नाम के साथ) खोजना चाहता / चाहती हूँ। मैं एक GUI उपयोगिता का उपयोग करने के बजाय कमांड लाइन से यह करना चाहता हूं।

विंडोज में, मैं निम्नलिखित चलाऊंगा:

cd /d C:\
dir *filename* /s

लिनक्स क्या है?


खैर, इस बिल्ली की त्वचा के लिए एक तरह से स्पष्ट रूप से अधिक है । मैं अभी भी यह जानने के लिए थोड़ा उत्सुक हूं कि क्या ऐसा करने का कोई तरीका है ls?
इज़्ज़ी

जवाबों:


13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(मुख्य नियम और शर्तों के लिए पढ़ें। फाइन प्रिंट के लिए मैनुअल पढ़ें।)

निर्देशिका की सामग्री को सूचीबद्ध करना एक द्वितीयक विशेषता की तरह है ls। का मुख्य काम ls, जो अपनी जटिलता का सबसे अधिक लेता है, वह अपने प्रदर्शन को ठीक करता है। (मैनुअल को देखें और यह चुनने के लिए कि फ़ाइलों को चुनने के लिए संबंधित विकल्पों की संख्या की तुलना करें। प्रत्येक फ़ाइल के बारे में कौन सी जानकारी प्रदर्शित करने के लिए कौन-सी जानकारी नियंत्रित करती है और प्रदर्शन कैसे स्वरूपित होता है। यह GNU ls के दोनों सत्य है जो आप ' शुरुआती दिनों से कम विकल्पों के साथ लिनक्स और अन्य प्रणालियों पर खोज करेंगे ।)

डिफ़ॉल्ट मोड lsयह है कि जब आप इसे एक निर्देशिका पास करते हैं, तो यह उस निर्देशिका में फ़ाइलों को सूचीबद्ध करता है। यदि आप इसे किसी अन्य प्रकार की फ़ाइल (नियमित फ़ाइल, प्रतीकात्मक लिंक, आदि) पास करते हैं, तो यह उस फ़ाइल को सूचीबद्ध करता है। (यह अलग से प्रत्येक तर्क पर लागू होता है।) विकल्प -dबताता है कि lsकभी भी एक निर्देशिका में नहीं उतरना चाहिए।

lsएक विकल्प है -Rजो इसे निर्देशिका को पुनरावर्ती रूप से सूचीबद्ध करने के लिए कहता है। लेकिन यह सीमित प्रयोज्यता है, और आउटपुट पर बहुत अधिक फ़िल्टरिंग की अनुमति नहीं देता है।

पैटर्न मिलान करने के लिए बहुत पहला उपकरण शेल ही है। आपको किसी अन्य कमांड की आवश्यकता नहीं है: बस अपने वाइल्डकार्ड टाइप करें और आप सेट हैं। इसे ग्लोबिंग के नाम से जाना जाता है ।

echo *filename*

परंपरागत रूप से, वाइल्डकार्ड वर्तमान निर्देशिका (या संकेतित निर्देशिका:) तक सीमित थे echo /some/where/*filename*। एक *किसी भी फ़ाइल नाम, या फ़ाइल नाम के किसी भी हिस्से से मेल खाता है, लेकिन *.txtमेल नहीं खाएगी foo/bar.txt। आधुनिक गोले ने पैटर्न को जोड़ा है **/जिसका अर्थ है "इस निर्देशिका में, या इसके नीचे किसी भी निर्देशिका में (पुनरावर्ती)"। बैश के साथ, ऐतिहासिक अनुकूलता कारणों के लिए, इस सुविधा को स्पष्ट रूप से सक्षम किया जाना चाहिए shopt -s globstar(आप इस लाइन को अपने में डाल सकते हैं ~/.bashrc)।

echo **/*filename*

echoकमांड सिर्फ आपके द्वारा शेल पर उत्पन्न फ़ाइल नामों की सूची को गूँजती है। एक अपवाद के रूप में, यदि कोई मेल फ़ाइल नाम नहीं है, तो वाइल्डकार्ड पैटर्न को बैश में अपरिवर्तित छोड़ दिया जाता है (जब तक कि आप सेट नहीं करते हैं shopt -s nullglob, जिस स्थिति में पैटर्न एक खाली सूची में फैलता है), और zsh एक त्रुटि का संकेत देता है (जब तक आप सेट नहीं करते हैं setopt nullglob, या setopt no_no_matchजो पैटर्न को अपरिवर्तित छोड़ देता है)।

आप अभी भी lsइसके विकल्पों के लिए उपयोग करना चाह सकते हैं। उदाहरण के लिए, lsरंगों के माध्यम से फ़ाइल की प्रकृति या अनुमति (निर्देशिका, निष्पादन योग्य, आदि) के बारे में संकेत दे सकते हैं। आप फ़ाइल की तिथि, आकार और स्वामित्व को प्रदर्शित करना चाह सकते हैं ls -l। कई और विकल्पों के लिए मैनुअल देखें।

डायरेक्टरी ट्री में फ़ाइल देखने की पारंपरिक कमांड है find। यह कई विकल्पों के साथ आता है कि कौन सी फाइलों को प्रदर्शित करना है और उनके साथ क्या करना है। उदाहरण के लिए, उन फ़ाइलों को देखने के लिए जिनका नाम *filename*वर्तमान निर्देशिका और उसके उपनिर्देशिकाओं में पैटर्न से मेल खाता है और उनके नाम प्रिंट करते हैं:

find /some/dir -name '*filename*' -print

-printएक कार्रवाई है (अधिकांश अन्य कार्यों में फ़ाइल पर कमांड निष्पादित करना शामिल है); यदि आप कोई कार्रवाई नहीं करते हैं, -printतो निहित है। इसके अलावा, यदि आप किसी भी निर्देशिका को पार करने के लिए ( /some/dirऊपर) निर्दिष्ट नहीं करते हैं , तो वर्तमान निर्देशिका निहित है। शर्त -name '*filename'केवल उन फाइलों को सूचीबद्ध करने (या कार्य करने) के लिए कहती है जिनका नाम उस पैटर्न से मेल खाता है; कई अन्य फ़िल्टर हैं, जैसे -mtime -1कि पिछले 24 घंटों में संशोधित फ़ाइलों का मिलान करना। आप कभी-कभी उद्धरणों को छोड़ सकते हैं -name '*filename*', लेकिन केवल तभी जब वाइल्डकार्ड वर्तमान निर्देशिका में किसी भी फ़ाइल से मेल नहीं खाएगा (ऊपर देखें)। सब सब में, संक्षिप्त रूप है

find -name '*filename*'

एक और उपयोगी उपकरण जब आप जानते हैं (एक हिस्सा) एक फ़ाइल का नाम है locate। यह उपकरण फ़ाइल नामों के डेटाबेस पर सवाल उठाता है। विशिष्ट प्रणालियों पर, यह हर रात ताज़ा होता है। locateओवर find /का फायदा यह है कि यह बहुत तेज है। एक नकारात्मक पक्ष यह है कि इसकी जानकारी बासी हो सकती है। locateबहु-उपयोगकर्ता प्रणालियों पर उनके व्यवहार में भिन्नता के कई कार्यान्वयन हैं : मूल locateकार्यक्रम केवल सार्वजनिक रूप से पढ़ने योग्य फ़ाइलों को अनुक्रमित करता है (आप updatedbदूसरे डेटाबेस बनाने के लिए साथी को चलाना चाह सकते हैं जो आपके खाते की सभी फ़ाइलों को अनुक्रमित करता है); अन्य संस्करण (एमोलेट, स्लोकेट) हैं जो सभी फ़ाइलों को अनुक्रमित करते हैं और locateप्रोग्राम को डेटाबेस को केवल उन फ़ाइलों को वापस करने के लिए फ़िल्टर करते हैं जिन्हें आप देख सकते हैं।

locate filename

कभी-कभी आप सोचते हैं कि आपके वितरण में एक फ़ाइल एक पैकेज द्वारा प्रदान की जाती है, आप जानते हैं कि (फ़ाइल का हिस्सा) हिस्सा आपके पैकेज का नाम नहीं है, और आप पैकेज को स्थापित करना चाहते हैं। कई वितरण उसके लिए एक उपकरण प्रदान करते हैं। उबंटू पर, यह apt-file search filename। अन्य सिस्टम पर समतुल्य कमांड के लिए, Pacman Rosetta की जाँच करें ।


काश मैं इसे फिर से वोट कर सकता। आज रात बस एक और प्रोजेक्ट के लिए इसे देखना था। धन्यवाद फिर से, @Gilles!
इज़्ज़ी

6

आपके डॉस उदाहरण के बराबर होगा:

cd /
find . -name \*filename\* -print

लिनक्स पर आपको आम तौर पर -printतर्क की आवश्यकता नहीं होती है, हालांकि, अब। यदि आप खुद को अन्य ऑपरेटिंग सिस्टम पर काम करते हुए पाते हैं, तो इसके बारे में जानना आसान हो सकता है।


5

यदि आप कुछ "तेज़" चाहते हैं , लेकिन एक मिशन-महत्वपूर्ण स्थिति में नहीं है और आप केवल यह जानना चाहते हैं कि क्या यह मौजूद है और यह कहाँ है, तो आप उपयोग कर सकते हैं locate। यह निर्देशिका में सभी फाइलों का एक डेटाबेस रखता है जिसे आपने इस पर जानकारी एकत्र करने के लिए कहा है।

डिफ़ॉल्ट इंस्टॉल (उबंटू पर) में, locateएक दैनिक cronकाम सेट करता है जो फ़ाइल सिस्टम को स्कैन करता है और डेटाबेस को अपडेट करता है ...

यदि आपको लगता है कि आपको अगले क्रोन अपडेट से पहले डेटाबेस को अद्यतित करने की आवश्यकता है, तो यह आमतौर पर findया तो lsबस चलाने sudo updatedbऔर फिर से तेज है locate। यह निश्चित रूप से तेज़ है यदि आपको अधिक खोज करने की आवश्यकता है ... जैसा कि इसके नाम से पता चलता है, updatedbडेटाबेस का locateउपयोग करता है जो अपडेट करता है ...

locateबिल्ट-इन regex है, जो इसे बहुत आसान बनाता है ... मैं findएक स्क्रिप्ट में उपयोग करूंगा , लेकिन मैं शायद ही कभी findकमांडलाइन पर उपयोग करता हूं । मैं भी locate(व्यक्तिगत) स्क्रिप्ट में उपयोग ... उदाहरण के लिए।locate -bir "oo.*datt.*mp4$"

locate मिलान की गई फ़ाइलों के पूर्ण-योग्य पथ देता है।


2
find [path] -name [filename]

उदाहरण के लिए, अगर मैं / फ़ाइल निर्देशिका के लिए खोज करना चाहता हूं, जिसमें एक फ़ाइल नाम है, जिसमें मैं कमांड का उपयोग करूंगा:

find /home -name *foo*

man findआदेश और तर्कों को खोजने के लिए अधिक जानकारी के लिए कमांड का उपयोग करें ,


3
*शेल को व्याख्या करने से रोकने के लिए आपको एस को कोट करने या भागने की आवश्यकता है ।
शॉन जे। गोफ

क्या वह डिस्ट्रो / शेल विशिष्ट है? मैंने इसे बिना भागने के फेडोरा 16 में चलाया और इसने ठीक काम किया।
जॉश-कैन

1
कुछ गोले में विकल्प हैं जो तारों को कार्यक्रम में पास करते हैं यदि वे कुछ भी मेल नहीं खाते हैं। अपनी वर्तमान निर्देशिका में एक फ़ाइल बनाने का प्रयास करें जो उस पैटर्न से मेल खाती है, और फिर से कमांड का प्रयास करें।
शॉन जे। गोफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.