किसी भी डायरेक्टरी से फाइल कैसे खोजें


22

मैं Book1 नामक एक फ़ाइल की तलाश में हूँ ।

अपने परीक्षण में मैं उपरोक्त फ़ाइल को देखने की कोशिश कर रहा हूँ और इस परीक्षण में, मुझे नहीं पता कि वह फ़ाइल कहाँ स्थित है।

मैंने कोशिश की find / -iname book1लेकिन कोई आउटपुट नहीं है।

अगर मुझे नहीं पता कि कमांड फाइल का उपयोग करके बुक 1 नामक मेरी फाइल कैसे मिलेगी तो मुझे नहीं पता कि फाइल कहां स्थित है?

संपादित करें:

मेरा परिदृश्य नीचे और अधिक विस्तार से वर्णित है:

  1. फ़ाइल एक्सटेंशन अज्ञात है
  2. सटीक नाम (जैसे कि बड़े अक्षरों, संख्याओं आदि) अज्ञात है
  3. फ़ाइल का स्थान अज्ञात है

2
यदि कोई फ़ाइल है Book1, और यह एक निर्देशिका में है जिसे आप पढ़ सकते हैं, तो find / -iname book1उसे खोज लेंगे। क्या आपको यकीन है कि यह वास्तव में है Book1, और नहीं Book1.xyz?
फॉक्स

फ़ाइल का पूरा नाम Book1.gnumeric है। क्या आप कह रहे हैं कि मुझे फ़ाइल का पूरा नाम बताना होगा? किसी कारण के लिए मैंने सोचा, इस विशिष्ट कमांड के लिए, जो मुझे चाहिए वह फ़ाइल का सामान्य नाम है। मेरा परीक्षण एक फ़ाइल खोजने की कोशिश कर रहा है यदि उदाहरण के लिए, मुझे फ़ाइल एक्सटेंशन याद नहीं है और केवल उसी तरह का पता है जिस फ़ाइल की मुझे तलाश है। कृपया सलाह दें।
एस्पायर

@don_crissti किया। कृपया ऊपर संपादित करें देखें।
Aspire27

आप मिश्रण कर रहे हैं find और locatelocateउदार है, और जब तक यह अपने डेटाबेस में है, जो सामान्य रूप से दैनिक अद्यतन किया जाता है, तब तक कुछ भी मिल जाएगा। findइस मामले में, एक फ़ाइल ग्लोब की तलाश में है, जिस तरह का पैटर्न आप उपयोग करेंगे ls। आप शायद मतलब है iname '*book1*'। ध्यान दें कि पैटर्न findको देखने से पहले शेल को विस्तार से रोकने के लिए उद्धरण के अंदर होना चाहिए । यह भी ध्यान दें कि find, कई * निक्स कमांड की तरह, जब यह असफल होता है, तो निराशा होती है।
मेन्जियो

जवाबों:


31

सबसे पहले, एक तर्क -inameएक शेल पैटर्न है । आप बैश मैनुअल में पैटर्न के बारे में अधिक पढ़ सकते हैं । सार यह है कि findवास्तव में फ़ाइल को खोजने के लिए फ़ाइलनाम को निर्दिष्ट पैटर्न से मेल खाना चाहिए। केस-असंवेदनशील स्ट्रिंग book1मैच बनाने के लिए Book1.gnumericआपको या *तो इसे जोड़ना होगा ताकि यह इस तरह दिखे:

find / -iname 'book1*'

या पूरा नाम निर्दिष्ट करें:

find / -iname 'Book1.gnumeric'

दूसरा, फ़ाइल नाम मामले -inameको findअनदेखा कर देगा ताकि यदि आप -iname book1इसे निर्दिष्ट करते हैं तो यह भी मिल सकता है Book1, bOok1आदि। यदि आप सुनिश्चित हैं कि जिस फ़ाइल को आप देख रहे हैं उसे कॉल किया जाता है , लेकिन इसका Book1.gnumeric उपयोग न करें , यह तेज़ होगा:-iname-name

find / -name 'Book1.gnumeric'

तीसरा, पैटर्न को उद्धृत करने के बारे में याद रखें जैसा कि दूसरे उत्तर में कहा गया है ।

और अंतिम - क्या आप सुनिश्चित हैं कि आप अपने सिस्टम पर हर जगह फ़ाइल देखना चाहते हैं ? यह संभव है कि आप जिस फ़ाइल की तलाश कर रहे हैं वह वास्तव में आपकी $HOMEनिर्देशिका में है यदि आपने उस पर काम किया है या इसे कहीं से डाउनलोड किया है। फिर, यह बहुत तेज हो सकता है।

संपादित करें :

मैंने देखा कि आपने अपना प्रश्न संपादित किया। यदि आपको पूर्ण फ़ाइल नाम, पूंजीकरण और स्थान की जानकारी नहीं है, तो आपको वास्तव में कुछ इस तरह का उपयोग करना चाहिए:

find / -iname 'book1*'

मैं यह भी सुझाव देता हूं कि यदि आप एक गैर-रूट उपयोगकर्ता के रूप में आमंत्रित करते हैं तो 2>/dev/nullसभी *permission denied*और अन्य त्रुटियों को छिपाने के लिए लाइन के अंत में डाल देंगे find:

find / -iname 'book1*' 2>/dev/null

और अगर आपको यकीन है कि आप किसी एकल फ़ाइल की तलाश कर रहे हैं, और आपके सिस्टम पर केवल एक ही फ़ाइल है जो उन मानदंडों से मेल खाती है जिन्हें आप findपहली मिलान फ़ाइल खोजने के बाद बाहर निकलने के लिए कह सकते हैं :

find / -iname 'book1*' -print -quit 2>/dev/null


6

आप locateकमांड की कोशिश कर सकते हैं । यह खोज को तेज़ बनाने के लिए फ़ाइलनाम के डेटाबेस का उपयोग करता है।

सभी फ़ाइल मिलान *book1*और मामले को अनदेखा करने के लिए, आप उपयोग कर सकते हैं

locate -i book1

यदि आप अपने साथ शुरू होने वाली फ़ाइलों की खोज करना चाहते हैं तो आपको book1वाइल्डकार्ड को खुद करना होगा:

locate -i 'book1*'

यह की तुलना में बहुत तेज़ है find, लेकिन केवल अप-टू-डेट है क्योंकि पिछली बार डेटाबेस ताज़ा किया गया था।


5

यदि आप जानते हैं कि आपके पास एक फ़ाइल है book1.something, जहाँ फ़ाइल स्थान, सटीक मान somethingऔर फ़ाइल नाम का कैपिटलाइज़ेशन पैटर्न सभी हैं:

find / -iname 'book1.*'

यदि आप सभी जानते हैं कि फ़ाइल नाम में शब्द है book, तो आप इसके साथ एक बहुत बड़ी सूची तैयार कर सकते हैं

find / -iname '*book*'

तर्क -nameएक शेल ग्लोब पैटर्न है। फ़ाइल जिस निर्देशिका में है, उसकी तुलना करें:

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

यह उस प्रकार की खोज का प्रतिनिधित्व करता है जिसके द्वारा प्रदर्शन किया गया है -name-inameविकल्प बस इस के एक केस-असंवेदनशील संस्करण की अनुमति देता है।


1

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

जिसका नाम शामिल सभी फ़ाइलों की राह रिपोर्ट करेंगे book1(मामले के किसी भी बदलाव के साथ है, लेकिन केवल ASCII लैटिन वर्णों पर विचार bokBOKकी तरह यूनिकोड में, नहीं कई अन्य रूपों 𝗄, 𝚔, 𝘬, , , , विशेषक साथ और सभी उनके विविधताओं ...) में आपके द्वारा पढ़ी गई सभी निर्देशिकाएं।


0

इस प्रकार के कार्यों के लिए मैं हमेशा करता हूं: find / -iregex '.*Book1.*'

यह फ़ॉर्म आपके परिदृश्य के 3 बिंदुओं का ध्यान रखेगा ( iregexयह एक असंवेदनशील तर्कसंगत अभिव्यक्ति है, और .*दोनों तरफ वाला पैटर्न बुक 1 के आपके निश्चित पैटर्न से पहले और बाद में किसी भी चरित्र से मेल खाएगा - यह स्पष्ट रूप से आपको आवश्यक से अधिक परिणाम दे सकता है। लेकिन आप सुनिश्चित हैं कि फ़ाइल को याद न करें)

मुख्य अंतर यह है: यदि संभव हो तो, बस का उपयोग करने से अधिक प्रतिबंधित हो /, केवल की कोशिश की तरह /home, या तो अन्यथा आप कुछ निर्देशिका जो अप्रासंगिक हैं में उतरेगा ( /sys, /dev, आदि ...)

हालाँकि याद रखें कि यूनिक्स अनुमतियां लागू होती हैं: यदि फ़ाइल उस निर्देशिका में है जिसके लिए findकमांड चलाने वाले उपयोगकर्ता के पास कोई एक्सेस (निष्पादित) findनहीं है , तो वह वहां नहीं मिल पाएगा।


iregex Solaris (OS निर्दिष्ट नहीं था) (और संभवतः * BSD) जैसी जगहों पर काम नहीं करेगा, यह एक GNU एक्सटेंशन है और मानक काfind
Gert van den Berg

0

रजत खोजक फ़ाइलों और सामग्री की खोज करने के लिए एक बहुत तेज़ और आसान उपयोग है।

आपकी समस्या को हल करने के लिए चांदी खोजक कमांड इस तरह दिखेगी ...

ag -g Book1

-g PATTERN PATTERN से मेल खाते फ़ाइल नाम


0

locate और इसके वेरिएंट एक तेज़ विधि है।

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

यदि पता उपलब्ध नहीं है, तो आप findइसके बजाय उपयोग कर सकते हैं । यह बहुत धीमा हो जाता है, लेकिन बहुत अधिक सटीक भी।

यदि आपके पास एक ही विभाजन है: (रूट के रूप में चलाएं यदि आपके उपयोगकर्ता के पास फ़ाइल तक पहुंच नहीं हो सकती है)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

यदि आप -xdev findअन्य विभाजनों, जैसे /procऔर /sys, पर अपनी चीजों को शामिल नहीं करते हैं, जो आपकी स्क्रीन को त्रुटियों से भर देते हैं, खासकर यदि आप जड़ नहीं हैं। (त्रुटियां ढूंढी गई 2> /dev/nullकमांड के अंत में जोड़कर छिपाई जा सकती हैं (टिप्पणी हटा दी जानी चाहिए))

यदि आपके पास कई विभाजन हैं और आप नहीं जानते कि कौन सी फ़ाइल चालू है, तो आप lsblk(Linux- आधारित OSes पर, के साथ एक सूची प्राप्त कर सकते हैं , पार्सिंग dfआउटपुट एक विकल्प है अन्यथा) और इसे खोजने के लिए फ़ीड करें: (यदि आप फिर से रूट करें पता नहीं कि आप फ़ाइल तक पहुँच सकते हैं)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(यह थोड़ा नाजुक है अगर आपके किसी भी माउंटपॉइंट में जगह है) ( dfमापदंडों को ट्यूनिंग की आवश्यकता हो सकती है। - जीएनयू dfमानक POSIX आउटपुट देता है। अन्य संस्करणों में अन्य पैरामीटर हो सकते हैं या इसे छोड़ना पड़ सकता है। अपना मैन पेज पढ़ें)

grep -Fशामिल नहीं अन्य बातों के, लौट आए स्वैप विभाजन की तरह।

गैर-जीएनयू संस्करण में, awk डिवाइसों को माउंट के साथ /devवास्तविक फ़ाइल सिस्टम प्राप्त करने के लिए शुरू करते हैं और फिर dfआउटपुट से अंतिम फ़ील्ड (माउंटपॉइंट) प्रिंट करते हैं ।

यह एक बोर्न-जैसा शेल भी मानता है ( kshऔर bashकाम करना चाहिए। यदि आप एक cshवेरिएंट का उपयोग कर रहे हैं , तो इसे आज़माने से पहले एक स्क्रिप्ट योग्य शेल शुरू करें)


grepरों थोड़ा शोर हो सकता है, यह फिल्टर करने के लिए कैसे जानने के बेहतर (इस उदाहरण के साथ की जरूरत नहीं किया जाना चाहिए, लेकिन अगर यह कुछ अधिक आम है कि के लिए देखा जाता है, greps ट्यूनिंग की जरूरत है नीचे शोर का स्तर बनाए रखने के लिए होता है)
गर्ट वैन डेन बर्ग

0

एजी (चांदी खोजकर्ता) फाइलों में बहुत तेजी से खोज प्रदान करता है, और फ़ाइल नाम के लिए खोज करने का एक विकल्प भी है:

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

तो मेरे उपयोग के मामले में यहां यह> 30 गुना तेज है अगर फ़ाइल एग द्वारा अनदेखी की गई फ़ाइल नहीं है।

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