कमांड-लाइन का उपयोग करके नाम से एक फ़ाइल ढूंढें


182

मैं कमांड-लाइन का उपयोग करके किसी फ़ाइल का स्थान निर्धारित करना चाहूंगा। मैंने कोशिश की है:

find . -type f -name "postgis-2.0.0"

तथा

locate postgis-2.0.0

कोई फायदा नहीं। फ़ाइल की निर्देशिका को निर्धारित करने के लिए कमांड क्या है, इसका नाम प्रदान किया गया है?


2
locateआदेश ठीक है, बस locatedb पहले अद्यतन करते हैं, आदेश का उपयोगupdatedb
thucnguyen

यदि यह पहले से स्थापित है, तो नया फ़ाइल नाम postgis-2.0.0अब नहीं हो सकता है। आमतौर पर पैकेज प्रबंधकों के माध्यम से इंस्टॉलेशन के बाद, निष्पादन योग्य एक $PATHफ़ोल्डर में होगा, which postgisस्थान को देखने का प्रयास करें। यदि यह कुछ भी नहीं देता है, तो केवल आपको मैन्युअल रूप से फ़ाइल स्थान की तलाश करनी चाहिए।
sdkks

जवाबों:


231

find ~/ -type f -name "postgis-2.0.0"इसके बजाय कोशिश करें ।

का उपयोग .कर केवल वर्तमान निर्देशिका खोज करेंगे। ~/आपकी संपूर्ण होम डायरेक्टरी खोजेगा (संभावना है कि आपने इसे कहां से डाउनलोड किया है)। यदि आप wgetरूट के रूप में उपयोग करते हैं, तो इसका संभवना कहीं और हो सकता है इसलिए आप /पूरे फाइल सिस्टम को खोजने के लिए उपयोग कर सकते हैं ।

सौभाग्य


1
ओह फिर मैंने wgetरूट के रूप में इस्तेमाल किया, इसलिए /धन्यवाद
सैम 007

अधिक लिंक के लिए इस लिंक help.ubuntu.com/community/find
habibun

मुझे पता चलता है: / उपयोगकर्ता / उपयोगकर्ता नाम // लाइब्रेरी / सहेजे गए एप्लिकेशन स्टेट / com.bitrock.appinstaller.savedState: अनुमति से इनकार त्रुटि। यह कमांड के प्रत्येक निष्पादन पर दिखाई देता है। मैं इससे छुटकारा कैसे पाऊं?
एडुआर्ड

29

मैं कोशिश करूँगा:

sudo find / -type d -name "postgis-2.0.0"

द। केवल वर्तमान निर्देशिका में खोज का अर्थ है, यदि आप वास्तव में नहीं जानते हैं तो सब कुछ रूट से खोजना सर्वोत्तम है। इसके अलावा, टाइप -f का मतलब फाइलों की तलाश है, न कि फ़ोल्डरों की। जोड़ने sudoसे यह सभी फ़ोल्डर / सबफ़ोल्डर में खोज करने की अनुमति देता है।

आपके लिए सिंटैक्स locateसही है, लेकिन आपको दौड़ना पड़ सकता है

sudo updatedb

प्रथम। जो भी कारण के लिए, मैं locateहालांकि के साथ अच्छी किस्मत कभी नहीं है ।

locateद्वारा बनाई गई फ़ाइलों और निर्देशिकाओं के डेटाबेस का उपयोग करता है updatedb। इसलिए यदि आपने एक नई फ़ाइल डाउनलोड की है, तो इस बात की अधिक संभावना है कि आपके updatedbने फ़ाइलों और निर्देशिकाओं के डेटाबेस को अपडेट नहीं किया है। आप उपयोगिता कार्यक्रम sudo updatedbका उपयोग करने से पहले उपयोग कर सकते हैं locateupdatedbआम तौर पर लाइनक्स सिस्टम पर दिन में एक बार चलता है।


14

खोज सबसे उपयोगी लिनक्स / यूनिक्स उपकरणों में से एक है।

प्रयत्न, कोशिश find . -type d | grep DIRNAME


क्या यहाँ grep ओवरनाम का उपयोग करने का कोई फायदा है?
ट्राइहार्डर

@oooooo मैंने अपने जवाब में नीचे एक कारण जोड़ा है
zanbri

लगता है प्लस ग्रेप केवल बात यह है कि मेरे लिए काम किया था
malhal

12

अन्य उत्तर अच्छे हैं, लेकिन मुझे लगता है कि छूटने वाले Permission deniedकथन मुझे स्पष्ट उत्तर देते हैं ( stderrभाग नहीं होने के कारण चूक जाते हैं sudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

कहाँ पे:

  • / उस निर्देशिका से बदला जा सकता है जिसे आप अपनी खोज शुरू करना चाहते हैं
  • fdयदि आप किसी फ़ाइल के बजाय निर्देशिका खोज रहे हैं, तो उसे बदल दिया जा सकता है
  • -inameके साथ प्रतिस्थापित किया जा सकता है -nameयदि आप चाहते हैं कि खोज संवेदनशील हो
  • *खोज पद में यदि आप खोज में वाइल्डकार्ड नहीं करना चाहती छोड़ा जा सकता है

एक विकल्प है:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

इस तरह से परिणाम मिलता है यदि खोज-अवधि पूरी फ़ाइल पथ में कहीं भी मेल खाती है, उदाहरण के लिए /home/postgis-2.0.0/docs/Readme.txt


2
के साथ खोज करने के लिए स्विच -regexऔर हैं , जो पथ का उल्लेख भी पाएंगे। किसी भी आइटम को खोजने के लिए सुझाव जो एक फ़ाइल ( ) है तो अधिक संसाधन महंगा है। ऐसा तब होता है जब उपयोगकर्ता के पास फ़ाइलों या फ़ोल्डरों तक पहुंच नहीं होती है, खोजने से पहले उपयोग करने से सभी फ़ाइलों को देखने की अनुमति मिल जाएगी। -iregexRegular Expressions-type fgrepPermission deniedsudo
sdkks

1
रेगेक्स स्विच के बारे में जानना अच्छा है, धन्यवाद।
ज़नबरी

@zanbri का उपयोग करें -wholenameया -iwholenameपाइप करने के बजाय grep
वेजेंड्रिया

4

प्रयत्न, कोशिश find . -name "*file_name*"

  • जहाँ आप 'बदल सकते हैं' ('वर्तमान निर्देशिका में') '

  • यदि आप "-name" को "-iname" में बदल सकते हैं यदि आप कोई मामला संवेदनशील नहीं चाहते हैं।

  • जहाँ आप " file_name " को बदल सकते हैं (एक फ़ाइल जो फ़ाइल के बिल्कुल नाम पर शुरू और समाप्त हो सकती है)।


3

यह फ़ाइल का पता लगाने को आसान बनाना चाहिए:

इससे आपको फ़ाइल का पूरा रास्ता मिल जाएगा

tree -f  / | grep postgis-2.0.0

ट्री एक ट्री जैसे प्रारूप में निर्देशिका की सामग्री को सूचीबद्ध करता है। -fपेड़ बताता फाइल करने के लिए पूरा पथ देने के लिए। चूँकि हमें इसके स्थान या मूल स्थान का कोई पता नहीं है, फिर से फाइल सिस्टम रूट से /नीचे की ओर खोज करने के लिए अच्छा है । फिर हम अपने शब्द को उजागर करने के लिए grep को आउटपुट भेजते हैं,postgis-2.0.0


0

जबकि findकमांड ट्री को डायरेक्ट्री ट्री को पीछे करने का सबसे सरल तरीका है, वहाँ अन्य तरीके हैं और विशेष रूप से दो स्क्रिप्टिंग भाषाएं जो डिफ़ॉल्ट रूप से उबंटू के साथ आती हैं उनमें पहले से ही ऐसा करने की क्षमता है।

दे घुमा के

bash एक बहुत अच्छा globstarखोल विकल्प है, जो निर्देशिका ट्री के पुनरावर्ती ट्रैवर्सल के लिए अनुमति देता है। ./**/*विस्तार में आइटम एक फ़ाइल है और क्या इसमें वांछित पाठ है या नहीं, इसके लिए हमें बस इतना करना होगा :

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

पर्ल

पर्ल में फाइंड मॉड्यूल है, जो निर्देशिका ट्री के पुनरावर्ती ट्रैवर्स को प्रदर्शन करने की अनुमति देता है, और सबरूटीन के माध्यम से उन पर विशिष्ट कार्रवाई करता है। एक छोटी स्क्रिप्ट के साथ, आप डायरेक्टरी ट्री को पीछे छोड़ सकते हैं, फाइलों को पुश कर सकते हैं, जिसमें वांछित स्ट्रिंग ऐरे में होती है, और फिर इसे इस तरह प्रिंट करें:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

और यह कैसे काम करता है:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

अजगर

पायथन एक अन्य स्क्रिप्टिंग भाषा है जो उबंटू दुनिया में बहुत व्यापक रूप से उपयोग की जाती है। विशेष रूप से, इसमें os.walk()मॉड्यूल है जो हमें ऊपर की तरह एक ही कार्रवाई करने की अनुमति देता है - ट्रैवर्स डायरेक्टरी ट्री और वांछित स्ट्रिंग वाले फाइलों की सूची प्राप्त करना।

वन-लाइनर के रूप में यह किया जा सकता है:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

पूरी स्क्रिप्ट ऐसी लगेगी:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))

0

$ find . -type f | grep IMG_20171225_*

./03-05--2018/IMG_20171225_200513.jpg
कमांड के बाद डीओटी देता है findएक प्रारंभिक बिंदु,
इसलिए - वर्तमान फ़ोल्डर,
नाम फ़िल्टर के माध्यम से "पाइप्ड" (= फ़िल्टर्ड)IMG_20171225_*

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