जवाबों:
मौजूदा उत्तरों को पूरा करने के लिए:
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
खुद वाइल्डकार्ड का समर्थन करता है।
ls
किसी निर्देशिका को सूचीबद्ध करने के लिए कहते हैं , तो वह इसे खोलता है, यह करने जैसा ही है ls -l BirthdayPhotos
। आप उस व्यवहार को दबा सकते हैं ls -d B*
।
B*
एक निर्देशिका विनिर्देश के रूप में क्यों व्यवहार करता है?
B*
सभी निर्देशिकाओं से मेल खाने के लिए होता है, जो B
इसलिए शुरू होती हैं ताकि आप वास्तव ls
में निर्देशिकाओं की सूची से गुजर रहे हों , इसलिए यह उन सभी को आपके लिए खोल देता है।
ls -d ABC*
लेखक के बारे में क्या पूछ रहा था। इसके अलावा कोड स्निपेट में टिप्पणी गलत कर रहे हैं, ls abc*
को सूचीबद्ध सामग्री एबीसी के साथ शुरू निर्देशिकाओं।
आप find
पैटर्न के साथ फ़ाइलों को खोजने के लिए कमांड का उपयोग कर सकते हैं
find . -type f -name "abc*"
उपरोक्त कमांड मौजूदा वर्किंग डायरेक्टरी के तहत एबीसी के साथ शुरू होने वाली फाइल को खोजेगा।
-name 'abc'
उन फ़ाइलों को सूचीबद्ध करेगा जो सटीक मिलान हैं। जैसे: abc
आप भी उपयोग कर सकते हैं
-iname
-regex
find
एक पैटर्न का उपयोग करके फ़ाइल नाम खोजने के लिए कमांड के साथ विकल्प
इसे करने के कई तरीके हैं, यह इस बात पर निर्भर करता है कि आप उनके साथ क्या करना चाहते हैं। आम तौर पर, यदि आप उन्हें सूचीबद्ध करना चाहते हैं, तो आप इसका उपयोग टर्मिनल में कर सकते हैं:
find | grep '^\./ABC'
... और ABC
आपके पाठ की जगह ।
कमांड को समझने के लिए, इसे थोड़ा नीचे तोड़ें:
find
वर्तमान निर्देशिका और इसके उप-निर्देशिकाओं के तहत सभी फाइलों को सूचीबद्ध करता है; अकेले इसका उपयोग करने से वहां सब कुछ सूचीबद्ध हो जाएगा। ध्यान दें कि find
प्रत्येक फ़ाइल या निर्देशिका के साथ शुरू होता है ./
, यह दर्शाता है कि उनका मार्ग वर्तमान निर्देशिका के सापेक्ष है। इसके बारे में जागरूक होना महत्वपूर्ण है क्योंकि इसका मतलब है कि हम परिणामों की खोज शुरू करेंगे, ./ABC
न कि सिर्फ शुरुआत के साथ ABC
।
पाइप वर्ण |
एक कमांड के आउटपुट को दूसरे में रीडायरेक्ट करता है, इस मामले में आउटपुट find
को रीडायरेक्ट किया जाता है grep
। इसे पाइपिंग कहा जाता है।
grep
उत्पादन लेता है और दिए गए पैटर्न का उपयोग कर इसे फिल्टर, ^\./ABC
।
' '
शेल को इसके अंदर विशेष वर्णों की व्याख्या करने से रोकने के लिए एकल उद्धरण के साथ उद्धृत किया गया है।अब पैटर्न ही एक विशेष वाक्यविन्यास में लिखा जाता है जिसे नियमित अभिव्यक्ति कहा जाता है , या संक्षेप में regex । Regex एक अत्यंत शक्तिशाली खोज उपकरण यदि आप इसे महारत हासिल है, और इस तरह के रूप साइटों इस जो अधिक गहराई में इसके बारे में पढ़ाते हैं, लेकिन ध्यान रखें कि grep
एक पूर्ण regex इंजन नहीं है और आप इसके साथ सब कुछ नहीं कर सकते।
हमारे उद्देश्य के लिए:
^
रेगेक्स में स्ट्रिंग की शुरुआत से मेल खाता है; यदि यह फ़ाइल नाम की शुरुआत में नहीं होता है तो यह पैटर्न से मेल खाने से रोकता है।
.
regex में एक विशेष अर्थ भी है: इसका अर्थ है "किसी भी एकल वर्ण का यहाँ मिलान करें"। यदि आप इसे शाब्दिक बिंदु के रूप में उपयोग करना चाहते हैं, तो आपको \
इससे पहले बैकस्लैश का उपयोग करके "बच" जाना होगा। (हाँ, किसी भी चरित्र का मिलान हमारे मामले में हानिरहित होगा, लेकिन मैंने इसे पूर्णता के लिए किया है।)
find | grep
जब आपके find
पास पूरी तरह से अच्छी पैटर्न-मिलान क्षमताएं होंगी तो आप क्यों करेंगे ?
आप GREP का उपयोग कर सकते हैं, मुझे लगता है कि यह सबसे सरल उपाय है, शायद मैच को और सटीक बनाने के लिए कुछ अन्य grep पैरामीटर भी जोड़ें
tree | grep ABC
आप Nautilus फ़ाइल प्रबंधक और नियमित अभिव्यक्ति का उपयोग करके एक विशेष पैटर्न की खोज कर सकते हैं।
ऐसा करने के लिए, नीचे दिए गए गियर मेनू में सेलेक्ट आइटम मिलान पर क्लिक करें (आप Ctrl+ दबा सकते हैं s)।
फिर, बस नियमित अभिव्यक्ति टाइप करें ABC*
और मान्य करें।
प्रत्येक फ़ाइल जिसका नाम आपके पैटर्न से मेल खाता है, स्वचालित रूप से चुना जाएगा।
मैं Ubuntu 12.10 (क्वांटल) पर GNOME3 PPA से Nautilus 3.6 का उपयोग कर रहा हूं ।
मेरे लिए सबसे आसान उपाय
ls | grep PATTERN
यहां आप PATTERN में कोई भी नियमित अभिव्यक्ति दे सकते हैं।
उदाहरण के लिए, इसके नाम के भीतर कहीं भी "ab" वाली फाइलें खोजने के लिए, टाइप करें
ls | grep ".*ab.*"
"अब" से शुरू होने वाली फ़ाइलों को खोजने के लिए, टाइप करें
ls | grep "^ab"
यदि आपको नहीं पता कि 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
टिप्पणियाँ:
find
में शुरू होने वाले कमांड की तुलना में बहुत लंबा समय होगा और कई अनुमति त्रुटियों को उत्पन्न /
करेगा ।sudo updatedb
पहले चलना चाहिए ।मैं उपयोग करता हूं
ls | grep abc
या
ls -la | grep abc
यह एबीसी के साथ सभी फाइलें दिखाता है, न कि केवल एबीसी से शुरू होता है। लेकिन, ऐसा करना मेरे लिए वास्तव में आसान तरीका है।
अजगर:
$ 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 },".")'
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
मेरे पसंदीदा विम प्लग में से एक में कमांड-टी , यह FZF के साथ एकीकरण के ऊपर रूबी आधारित प्लगइन है ।
Comamnd-T और FZF का उपयोग करके आप इसके लिए एक अत्यंत तेज़ "फ़ज़ी" तंत्र के साथ खोज कर सकते हैं:
जैसा कि आप देख सकते हैं
मैं हमेशा एक नया टर्मिनल खोलकर और हिट करके कमांड इतिहास में खोज करता हूँ:
CTRL+R
किसी भी टर्मिनल टैब में लिखकर पुनरावर्ती रूप से सभी फ़ोल्डरों में खोज करने के अलावा:
fzf
फिर अपना फ़ाइल नाम शुरू करें
ABC
इसके अलावा, आप अंदर लिख सकते हैं vim
:CommandT
विशेष रूप से बड़े फ़ोल्डरों में वास्तव में मददगार।
मान लें कि मैं रूट डायरेक्टरी में हूं और मुझे आदि डायरेक्टरी की सूची चाहिए: हम लिखते हैं,
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
ls -l B*
करता हूं तो यह सभी निर्देशिकाओं की सामग्री को केवल निर्देशिका निर्देशिकाB
के नाम के साथ शुरू करने के साथ क्यों दिखाता है ?