एक निर्देशिका में "एबीसी" नाम से शुरू होने वाली सभी फाइलों की खोज कैसे करें?


58

मुझे कुछ विशेष नाम से शुरू होने वाली फ़ाइलों की खोज करने की आवश्यकता है। एक विशेष पैटर्न से शुरू होने वाली कई फाइलें हो सकती हैं और मैं निर्देशिका में मौजूद ऐसी सभी फाइलों को सूचीबद्ध करना चाहता हूं।

जवाबों:


60

मौजूदा उत्तरों को पूरा करने के लिए:

ls

डिफ़ॉल्ट निर्देशिका सूची उपयोगिता lsका उपयोग शेल के वाइल्डकार्ड के साथ संयोजन में किया जा सकता है। पैटर्न वाली सभी फ़ाइलों की खोज करने के लिए abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

ध्यान दें कि फ़ाइल एक्सटेंशन खोज परिणामों के लिए भी प्रासंगिक है।


tree

यदि हमें निर्देशिका ट्री में फ़ाइलों को सूचीबद्ध करने की आवश्यकता होती है, तो हम treeदिए गए पैटर्न की खोज करने के लिए भी जारी कर सकते हैं:

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

इस मामले में, treeखुद वाइल्डकार्ड का समर्थन करता है।


2
जब मैं ls -l B*करता हूं तो यह सभी निर्देशिकाओं की सामग्री को केवल निर्देशिका निर्देशिका Bके नाम के साथ शुरू करने के साथ क्यों दिखाता है ?
एरिक

@ एरिक क्योंकि जब आप lsकिसी निर्देशिका को सूचीबद्ध करने के लिए कहते हैं , तो वह इसे खोलता है, यह करने जैसा ही है ls -l BirthdayPhotos। आप उस व्यवहार को दबा सकते हैं ls -d B*
अज़ोर अहई

@AzorAhai लेकिन यह B*एक निर्देशिका विनिर्देश के रूप में क्यों व्यवहार करता है?
एरिक

@ErikE क्योंकि फ़ाइल ग्लोब का उपयोग B*सभी निर्देशिकाओं से मेल खाने के लिए होता है, जो Bइसलिए शुरू होती हैं ताकि आप वास्तव lsमें निर्देशिकाओं की सूची से गुजर रहे हों , इसलिए यह उन सभी को आपके लिए खोल देता है।
अज़ोर अहई

1
सवाल का जवाब नहीं देता। ls -d ABC*लेखक के बारे में क्या पूछ रहा था। इसके अलावा कोड स्निपेट में टिप्पणी गलत कर रहे हैं, ls abc*को सूचीबद्ध सामग्री एबीसी के साथ शुरू निर्देशिकाओं।
महानवयन

42

आप findपैटर्न के साथ फ़ाइलों को खोजने के लिए कमांड का उपयोग कर सकते हैं

find . -type f -name "abc*" 

उपरोक्त कमांड मौजूदा वर्किंग डायरेक्टरी के तहत एबीसी के साथ शुरू होने वाली फाइल को खोजेगा।

-name 'abc'उन फ़ाइलों को सूचीबद्ध करेगा जो सटीक मिलान हैं। जैसे: abc

आप भी उपयोग कर सकते हैं

 -iname
 -regex 

findएक पैटर्न का उपयोग करके फ़ाइल नाम खोजने के लिए कमांड के साथ विकल्प


7

इसे करने के कई तरीके हैं, यह इस बात पर निर्भर करता है कि आप उनके साथ क्या करना चाहते हैं। आम तौर पर, यदि आप उन्हें सूचीबद्ध करना चाहते हैं, तो आप इसका उपयोग टर्मिनल में कर सकते हैं:

find | grep '^\./ABC'

... और ABCआपके पाठ की जगह ।

कमांड को समझने के लिए, इसे थोड़ा नीचे तोड़ें:

  • findवर्तमान निर्देशिका और इसके उप-निर्देशिकाओं के तहत सभी फाइलों को सूचीबद्ध करता है; अकेले इसका उपयोग करने से वहां सब कुछ सूचीबद्ध हो जाएगा। ध्यान दें कि findप्रत्येक फ़ाइल या निर्देशिका के साथ शुरू होता है ./, यह दर्शाता है कि उनका मार्ग वर्तमान निर्देशिका के सापेक्ष है। इसके बारे में जागरूक होना महत्वपूर्ण है क्योंकि इसका मतलब है कि हम परिणामों की खोज शुरू करेंगे, ./ABCन कि सिर्फ शुरुआत के साथ ABC

  • पाइप वर्ण |एक कमांड के आउटपुट को दूसरे में रीडायरेक्ट करता है, इस मामले में आउटपुट findको रीडायरेक्ट किया जाता है grep। इसे पाइपिंग कहा जाता है।

  • grepउत्पादन लेता है और दिए गए पैटर्न का उपयोग कर इसे फिल्टर, ^\./ABC

    • ध्यान दें कि ' 'शेल को इसके अंदर विशेष वर्णों की व्याख्या करने से रोकने के लिए एकल उद्धरण के साथ उद्धृत किया गया है।
  • अब पैटर्न ही एक विशेष वाक्यविन्यास में लिखा जाता है जिसे नियमित अभिव्यक्ति कहा जाता है , या संक्षेप में regex । Regex एक अत्यंत शक्तिशाली खोज उपकरण यदि आप इसे महारत हासिल है, और इस तरह के रूप साइटों इस जो अधिक गहराई में इसके बारे में पढ़ाते हैं, लेकिन ध्यान रखें कि grepएक पूर्ण regex इंजन नहीं है और आप इसके साथ सब कुछ नहीं कर सकते।

  • हमारे उद्देश्य के लिए:

    • ^रेगेक्स में स्ट्रिंग की शुरुआत से मेल खाता है; यदि यह फ़ाइल नाम की शुरुआत में नहीं होता है तो यह पैटर्न से मेल खाने से रोकता है।

    • .regex में एक विशेष अर्थ भी है: इसका अर्थ है "किसी भी एकल वर्ण का यहाँ मिलान करें"। यदि आप इसे शाब्दिक बिंदु के रूप में उपयोग करना चाहते हैं, तो आपको \इससे पहले बैकस्लैश का उपयोग करके "बच" जाना होगा। (हाँ, किसी भी चरित्र का मिलान हमारे मामले में हानिरहित होगा, लेकिन मैंने इसे पूर्णता के लिए किया है।)


1
find | grepजब आपके findपास पूरी तरह से अच्छी पैटर्न-मिलान क्षमताएं होंगी तो आप क्यों करेंगे ?
दारेल

3

आप GREP का उपयोग कर सकते हैं, मुझे लगता है कि यह सबसे सरल उपाय है, शायद मैच को और सटीक बनाने के लिए कुछ अन्य grep पैरामीटर भी जोड़ें

tree | grep ABC

2

आप Nautilus फ़ाइल प्रबंधक और नियमित अभिव्यक्ति का उपयोग करके एक विशेष पैटर्न की खोज कर सकते हैं।

ऐसा करने के लिए, नीचे दिए गए गियर मेनू में सेलेक्ट आइटम मिलान पर क्लिक करें (आप Ctrl+ दबा सकते हैं s)।

यहाँ छवि विवरण दर्ज करें

फिर, बस नियमित अभिव्यक्ति टाइप करें ABC*और मान्य करें।

यहाँ छवि विवरण दर्ज करें

प्रत्येक फ़ाइल जिसका नाम आपके पैटर्न से मेल खाता है, स्वचालित रूप से चुना जाएगा।

यहाँ छवि विवरण दर्ज करें

मैं Ubuntu 12.10 (क्वांटल) पर GNOME3 PPA से Nautilus 3.6 का उपयोग कर रहा हूं ।


1

मेरे लिए सबसे आसान उपाय

ls | grep PATTERN

यहां आप PATTERN में कोई भी नियमित अभिव्यक्ति दे सकते हैं।

उदाहरण के लिए, इसके नाम के भीतर कहीं भी "ab" वाली फाइलें खोजने के लिए, टाइप करें

ls | grep ".*ab.*"

"अब" से शुरू होने वाली फ़ाइलों को खोजने के लिए, टाइप करें

ls | grep "^ab"

1

यदि आपको नहीं पता कि ABC*फाइलें किस निर्देशिका में स्थित हैं, और आपके पास लाखों फाइलें हैं, तो locateकमांड सबसे तेज विधि है।

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

टिप्पणियाँ:

  • उपरोक्त कमांड 1 मिलियन फाइलों पर चलने के लिए 1 सेकंड लेता है।
  • रूट डायरेक्टरी findमें शुरू होने वाले कमांड की तुलना में बहुत लंबा समय होगा और कई अनुमति त्रुटियों को उत्पन्न /करेगा ।
  • यदि फ़ाइलें आज बनाई गई हैं, तो आपको sudo updatedbपहले चलना चाहिए ।

0

मैं उपयोग करता हूं

ls | grep abc

या

ls -la | grep abc

यह एबीसी के साथ सभी फाइलें दिखाता है, न कि केवल एबीसी से शुरू होता है। लेकिन, ऐसा करना मेरे लिए वास्तव में आसान तरीका है।


0

अजगर:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

पर्ल:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

यह ग्लोब पैटर्न मैचिंग है जो दोनों सिरों पर लंगर डाले हुए है। यह "एबीसी" जैसे "एबीसी", "एबीसी.टेक्स्ट", "एबीसी123" से शुरू होने वाली फाइलों के सभी घटनाओं से मेल खाएगा, लेकिन "एक्सएबीसी" नहीं। कमांड लाइन से 'प्रिंट' के स्थान पर 'ls' का उपयोग करना यहाँ एक सुरक्षित विकल्प है, हालांकि, इस बात पर निर्भर करता है कि आप किससे सहमत हैं, 'ls' स्क्रिप्ट में उपयोग के लिए सुरक्षित नहीं है। उस मामले में ग्लोब पैटर्न के मिलान के साथ 'प्रिंटफ' का उपयोग करना सुरक्षित माना जाता है। यदि आप एक स्क्रिप्ट में इसका उपयोग करने जा रहे हैं, तो 'Printf' का आउटपुट आउटपुट लाइन के अंत तक एक नई लाइन वर्ण नहीं होगा:

printf "%s" /path/to/files/ABC*  

यह दिखाता है:

/path/to/files/ABC /path/to/files/ABC123

यदि आपको प्रत्येक उदाहरण के बाद लाइन ब्रेक चाहिए:

printf "%s\n" /path/to/files/ABC*

यह दिखाता है:

/path/to/files/ABC 

/path/to/files/ABC123

यदि आप 'प्रिंटफ' कमांड चलाते हैं, तो "पथ / / से / फाइलें /" आउटपुट में रहता है। इसके बिना बस फ़ाइल का नाम दिखाई देता है:

printf "%s" ABC* 

रिटर्न

ABC ABC123

मान लें कि आप उस डायरेक्टरी के भीतर कमांड चलाते हैं जिसमें फाइलें मौजूद हैं।


यह echo /path/to/files/ABC* | tr " " "\n"एक अच्छा विचार नहीं है। विचार करें कि क्या कोई फ़ाइल है /path/to/files/ABC EFG, फ़ाइल नाम में एक स्थान है। आपका trफ़ाइल नाम दो अलग-अलग लाइनों में टूट जाएगा, जो अच्छा नहीं है। फ़ाइल नाम में कई स्थान होने पर और भी बदतर। मैं आपको printf "%s\n" ABC*इसके बजाय उपयोग करने की सलाह दूंगा, जो कि फिल्नाम में रिक्त स्थान के साथ मदद करनी चाहिए, लेकिन अभी भी अन्य विशेष पात्रों के साथ समस्याग्रस्त है जैसे\n
Sergiy Kolodyazhnyy

0

मेरे पसंदीदा विम प्लग में से एक में कमांड-टी , यह FZF के साथ एकीकरण के ऊपर रूबी आधारित प्लगइन है

Comamnd-T और FZF का उपयोग करके आप इसके लिए एक अत्यंत तेज़ "फ़ज़ी" तंत्र के साथ खोज कर सकते हैं:

  • फाइलें और बफर खोलना
  • टैग और मदद के लिए कूदते हुए
  • रनिंग कमांड्स, या पिछली खोजें और कमांड्स
  • कीस्ट्रोक्स की न्यूनतम संख्या के साथ।

जैसा कि आप देख सकते हैं

यहाँ छवि विवरण दर्ज करें

मैं हमेशा एक नया टर्मिनल खोलकर और हिट करके कमांड इतिहास में खोज करता हूँ:

CTRL+R

किसी भी टर्मिनल टैब में लिखकर पुनरावर्ती रूप से सभी फ़ोल्डरों में खोज करने के अलावा:

fzf

फिर अपना फ़ाइल नाम शुरू करें

ABC

इसके अलावा, आप अंदर लिख सकते हैं vim

:CommandT 

विशेष रूप से बड़े फ़ोल्डरों में वास्तव में मददगार।


0

मान लें कि मैं रूट डायरेक्टरी में हूं और मुझे आदि डायरेक्टरी की सूची चाहिए: हम लिखते हैं,

find -type d -name "etc"

परिणाम हमें मिलता है,

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

एक और उदाहरण,

इसके अलावा हम लिख सकते हैं:

ls | grep "etc"

हमें मिला,

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