फ़ाइल नाम की लंबाई से फ़ाइलें ढूँढें


10

मैं फ़ाइल नामों की लंबाई से सभी फ़ाइलों को खोजना चाहता हूं।

उदाहरण के लिए अगर मैं इस तरह के रूप लंबाई 1 की फ़ाइलों को, पता लगाना चाहते हैं a.go, b.go

मैंने डाला:

grep '.\{1\}' file

लेकिन यह काम नहीं करता है। फ़ाइल नाम लंबाई द्वारा फ़ाइलों को खोजने के लिए मैं किस कमांड का उपयोग कर सकता हूं?


a.goलंबाई का एक फ़ाइल नाम है। लंबाई aका एक फ़ाइल नाम है। यह यूनिक्स है, न कि डॉस जहां नाम और विस्तार अलग थे और एक निहित .हमेशा फ़ाइलनाम का हिस्सा था।
पीटर कॉर्ड्स

जवाबों:


3

grepफ़ाइलों की सामग्री में पैटर्न की तलाश करता है। यदि आप फ़ाइलों के नाम देखना चाहते हैं , तो आप केवल शेल ग्लोब का उपयोग कर सकते हैं (यदि आप वर्तमान निर्देशिका में केवल फ़ाइल नाम पर विचार करना चाहते हैं):

echo ?.go

(वैसे, यह शेल है जो ग्लोब का मूल्यांकन करता है, echoकमांड नहीं ।)

यदि आप निर्देशिकाओं को पुनरावर्ती रूप से देखना चाहते हैं, तो वर्तमान निर्देशिका के साथ, उपयोग करने के लिए उपकरण है find:

find . -name '?.go'

(ध्यान दें कि शेल को findलागू करने से पहले आपको शेल के रूप में मूल्यांकन करने से रोकने के लिए पैटर्न को कोट करना होगा ।)


1
यह उन निर्देशिकाओं को भी खोजेगा जो पैटर्न से मेल खाते हैं? '.Go'।
स्लम

@ एसएलएम, निर्देशिका कई प्रकार की फाइलों में से एक है, ओपी ने निर्दिष्ट नहीं किया कि वह किस प्रकार की फाइलें थी।
स्टीफन चेज़लस

8

यदि आप केवल फ़ाइल नाम ढूंढना चाहते हैं, तो आप निम्न आदेश का उपयोग कर सकते हैं:

find -exec basename '{}' ';' | egrep '^.{100,}$'

वह चलाएगा find, फ़ाइल या निर्देशिका के नाम का उपयोग करके basenameउसे खींचेगा और फिर किसी भी फ़ाइल नाम या निर्देशिका नाम की तलाश करेगा जो कम से कम 100 वर्णों का हो। यदि आप एक सटीक लंबाई का फ़ाइल नाम ढूंढना चाहते हैं, तो {100}इसके बजाय का उपयोग करें {100,}

यदि आप पथ सहित फ़ाइल नाम ढूंढना चाहते हैं, तो यह करें:

find | egrep '/[^/]{100,}$'

यह फ़ाइल नाम उस संबंधित पथ पर लौटाएगा जहां आपने खोज आदेश चलाया था।


3

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

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

इस निर्देशिका में फ़ाइलों के लिए खोज रिटर्न:

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

इसलिए, X की लंबाई वाली फ़ाइलों को खोजने के लिए, हमें पथ को हटाने और अंतिम के बाद केवल वर्णों को मिलान करने की आवश्यकता होगी /:

 $ find . -type f | grep -P '/.{3}$'

sedआदेश सिर्फ निकाल देता है ./-Pझंडा पर्ल कम्पैटिबल रेग्युलर एक्सप्रेशंस जो के लिए आवश्यक हैं सक्रिय हो जाता है {n}जो एक PCRE बात और है $का मतलब है "स्ट्रिंग के अंत से मेल खाते हैं।"

आप भी बस ऐसा कर सकते हैं:

find . -type f | grep -P '/...$'

लंबाई 15 के फ़ाइलनाम से मिलान करने के लिए 15 डॉट्स टाइप करने वाली छोटी संख्या के लिए यह ठीक नहीं है।

अंत में, यदि आप एक्सटेंशन को अनदेखा करना चाहते हैं और केवल फ़ाइल के नाम से मेल खाना चाहते हैं, तो यह करें (जैसा कि @slm ने सुझाव दिया है):

find . -type f | grep -P '/.{1}\.'

हालाँकि, यह भी फ़ाइलों की तरह मिल जाएगा a.bo.go। यह बेहतर है यदि आपके फ़ाइलनाम में एक से अधिक हो सकते हैं .:

find . -type f | grep -P '/.{1}\.[^.]+$'

नोट: ऊपर दिए गए उपाय से आपको लगता है कि आपके पास अपेक्षाकृत समझदार फाइलनाम है जिसमें नई लाइन वर्ण आदि नहीं हैं। यह भी गणना में फिलानों में स्थान की अनदेखी नहीं करेगा जब आप जो चाहते हैं वह लंबाई नहीं हो सकती है। यदि इनमें से कोई एक समस्या है, तो मुझे बताएं और मैं अपने उत्तर को अपडेट करूंगा।


1

आप निर्दिष्ट नहीं करते हैं, लेकिन यदि फ़ाइलें एक निर्देशिका संरचना के भीतर हैं, तो आप उन findफ़ाइलों का पता लगाने के लिए उपयोग कर सकते हैं जिनकी लंबाई 1 है, जिनकी मदद से grep:

$ find . -type f  | grep -P '/.{1}\.'

उदाहरण

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

MacOS X पर, egrep का उपयोग करें और -P विकल्प को हटा दें
बार्ट कुमेल

@BartKummel - वास्तव में OSX पर मैं उपयोग करता हूं ggrep: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html । यह भी महसूस करें कि इस क्यू को OSX के रूप में टैग नहीं किया गया था, इसलिए इसका उपयोग grepउपयुक्त नहीं है।
SLM

1

मैं कुछ इस तरह का उपयोग करेंगे।

find . -type f -name "?.go"

तो अगर तुम दो डाल दो? " फिर आप दो अक्षरों और एक्सटेंशन के साथ फाइल नामों की तलाश कर रहे हैं।


0

जब आप खोज कमांड में नियमित रूप से छूट का उपयोग करना चाहते हैं, तो आपको ""इस तरह का उपयोग करना चाहिए :

find /var/log -iname "*.err" 

योर केस उपयोग के लिए:

find yourpath -type f -a -name "?.go"

आपको अपने असली रास्ते को अपनेपथ से बदलना चाहिए, -aइसका And -type fमतलब है कि आप केवल नियमित फ़ाइलों की तलाश कर रहे हैं।

? अगर आपकी याद आए तो आपके प्रश्न का अर्थ है डॉस जैसे एक चरचर।


-1

ls ?.* आपको वांछित परिणाम देने चाहिए।


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