कई फ़ोल्डर नामों में फ़ाइलें खोजें


44

मैं सूची में कोशिश कर रहा हूँ सभी फाइलों से dir1, dir2, dir3और dir4जो मेरे की एक उप निर्देशिका के रूप में कहीं हो सकता है cwdका उपयोग करते हुए findआदेश। मैंने बिना किसी सफलता के साथ कोशिश की:

find . -type f -regextype posix-egrep -regex 'dir1/.+|dir2/.+|dir3/.+|dir4/.+'

मैंने भी कोशिश की posix-extended। मैं इन फ़ाइलों को कैसे सूचीबद्ध कर सकता हूं?


खोजो। -Type f -regextype sed -regex "। * / dir [1-4] / [a-z0-9] *" ".. अब तक का सबसे छोटा उत्तर :) नीचे उत्तर देखें .. unix.stackexchange.com/a-390333 / 242983
अल्फा_989

जवाबों:


59

और अगर आप तीन फ़ोल्डरों नामित खोज करना चाहते हैं, तो foo, barहै, और bazसभी के लिए *.pyफ़ाइलें, इस आदेश का उपयोग करें:

find foo bar baz -name "*.py"

इसलिए यदि आप dir1 dir2 dir3उपयोग से फ़ाइलें प्रदर्शित करना चाहते हैंfind dir1 dir2 dir3 -type f

इसे इस्तेमाल करे find . \( -name "dir1" -o -name "dir2" \) -exec ls '{}' \;


मुझे स्पष्ट करना चाहिए था। मेरे पास उन फ़ाइलों के लिए पथ नहीं हो सकता है जिन्हें मैं खोजना चाहता हूं। मैं केवल यह जानता हूं कि वे वर्तमान डायर की उप-निर्देशिकाएं हैं।
एरोन

./dirइसके बजाय का उपयोग करेंdir
harish.venkat

Dir को अभी भी cwd में रहने की आवश्यकता होगी, हालांकि यह दो स्तर कम हो सकता है (उदा ./path/to/dir1), जिस स्थिति में ./dir1मौजूद नहीं होगा।
एरोन

उत्तर संपादित किया।
harish.venkat

8

-Path निर्देश का उपयोग करना सबसे अच्छा है:

find .  \( -type f -and -path '*/dir1/*' -or -path '*/dir2/*' -or -path '*/dir3/*' -or -path '*/dir4/*' \)

जिसका अर्थ है: वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलें खोजें जहाँ मार्ग में 'dir1' या 'dir2' या 'dir3' या 'dir4' हैं।


आपको कोष्ठक गलत जगह मिल गया है। जीएनयू / के मानक समकक्ष के लिए भी देखें -aऔर । -o-and-or
स्टीफन चेज़लस

4

बस सबको पता चल जाए। .*/प्रत्येक dirसमस्या को हल करने से पहले जोड़ना चूंकि regexयह पूर्ण पथ के खिलाफ मेल खाता है, ऐसा लगता है।


3

पिछले उत्तरों को पढ़ने के बाद यह मेरा पहला विचार है:

find . -type f -regextype posix-egrep -regex ".*/(dir1|dir2|dir3|dir4)/.+"

यह ध्यान में रखता है, कि रेगेक्स को पूरे फ़ाइलनाम से मेल खाना चाहिए, और यह समझना आसान है।


2

वाइल्डकार्ड (होम डाइरेक्टरी) और सामान्य एपाचे 2 लॉग डाइरेक्टरी द्वारा परिभाषित कई स्थानों में फास्ट ((!) विशेष फाइल्स (एक्सेस_लॉग) को खोजने के लिए ssl लॉग और गज़पेड पुराने लॉग को बाहर करने के लिए नाम फ़िल्टरिंग भी लागू होता है। यहां सीधे सवाल का जवाब नहीं है लेकिन किसी ऐसे व्यक्ति के लिए उपयोगकर्ता हो सकता है जिसने इन निर्देशों को पाया हो (जैसे कि)।

find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*"

विशेष रूप से \(और के पास रिक्त स्थान के साथ सावधान रहें \)

वैसे, मैंने अपने सर्वर में सबसे सक्रिय वेबसाइटों को खोजने के लिए, इसे एपेकटॉप के लिए उपयोग किया।

apachetop -d1 -s9 -p $(find / \( -path "*var/log/apache2*" -o -path "*home/*/logs*" \) -type f  -name "*access_log" ! -name "*ssl*" -print | sed 's/^/-f '/)

2

यदि आप regextype का उपयोग कर रहे हैं तो आपको dir1 को dir4 निर्दिष्ट करने की आवश्यकता नहीं है

find . -type f -regextype sed -regex ".*/dir[1-4]/[^/]*"
  • type f: फाइल्स नहीं डाइरेक्टरीज़ खोजें
  • regextype sed: sed regextype का उपयोग करता है
  • regex: संपूर्ण पथ में रेगेक्स का उपयोग करके खोज करता है
  • ".*/dir[1-4]/[a-z0-9]*":। * शुरुआत में किसी भी वर्ण का मतलब है जो प्रकार का हो सकता है (चार / संख्या / बैकस्लैश (/) आदि); dir [1-4] का अर्थ है "dir" जिसके बाद 1 और 4 के बीच की संख्या होती है; / [^ /] * बताता है कि निम्नलिखित dir1-4 में किसी भी पथनाम को छोड़ दिया गया है, जिसमें / उनमें है, इसलिए यह केवल निर्देशिका dir1-dir4 में फाइल लौटाता है और किसी भी उपनिर्देशिका को अनदेखा करता है जो dir1-dd4 के भीतर हो सकता है।

आपके द्वारा इसका परीक्षण करने के लिए एक निर्देशिका बनाई गई: https://github.com/alphaCTzo7G/stackexchange/tree/master/linux/findSolution04092017


(1) हम कभी भी हारून की सटीक स्थिति या आवश्यकताओं को नहीं जान सकते हैं, लेकिन अन्य उत्तरों ने विवेकपूर्ण निर्णय लिया है कि उसकी चार निर्देशिकाएं हैं, जिनके नाम अनिर्दिष्ट हैं। (वे हो सकता है red, green, blueऔर yellow, या वे हो सकता है John, Paul, Georgeऔर Ringo।) आपका जवाब मान लिया गया है कि वे सचमुच dir1 , dir2, dir3और dir4। … (Cont'd)
स्कॉट

(Cont'd)… (2) आप यह क्यों मानते हैं कि हारून उपनिर्देशिका खोज नहीं करना चाहता है? लगता है वह कह रहा है कि वह करता है। (३) आप उन फाइलों की खोज को सीमित क्यों कर रहे हैं जिनके नाम में केवल निचले अक्षर के अक्षर और अंक हैं (चीजों को छोड़कर foo_bar, foo.txtऔर FOO)? (४) /[^/]*जब आपका उत्तर इसका उपयोग नहीं करता है तो आपका पाठ क्यों समझाता है?
स्कॉट

हाय स्कॉट, आपकी टिप्पणी के लिए thats।
21_12 पर अल्फा_989

(1-3)। उन्होंने उल्लेख किया "मैं dir1, dir2, dir3 और dir4 से सभी फाइलों को सूचीबद्ध करने का प्रयास कर रहा हूं " जो कहीं भी मेरे cwd की उप निर्देशिका के रूप में हो सकती है , जिसका अर्थ है कि dir1-dir4 कहीं भी हो सकता है, लेकिन वह फ़ाइल को सही खोजना चाहता है dir1-dir4 के भीतर। tocourse, अगर इसका dir1-dir4 नहीं है, तो आपको इसे लाल_ ब्लू \ _ ग्रीन \ _ का उपयोग करके विशिष्ट नामों में बदलना होगा। आदि ..
अल्फा_

4. टाइपो वहाँ .. मैंने [a-z0-9] * का इस्तेमाल किया..इससे पहले कि यह महसूस किया कि [^ /] * कम है और अधिक समावेशी है..फिर इसे पोस्ट करने पर इसे बदलने के लिए। आपकी सावधान टिप्पणियों के लिए धन्यवाद।
अल्फा_989

0

मुझे पता है कि आपने निर्दिष्ट का उपयोग किया है, लेकिन केवल अन्य विकल्पों को दिखाने के लिए जिनका उपयोग किया जा सकता है, आप xargs का उपयोग कर सकते हैं:

find . -type d | grep -E "dir1$|dir2$" | xargs ls  

find . -name "dir1" -or -name "dir2" | xargs ls

आपके पास "फ़ोल्डर" नामक एक फ़ाइल हो सकती है जिसमें कुछ इस तरह है:

$ cat folders
dir1
dir2
dir3
dir4

फिर, आप कुछ इस तरह से कर सकते हैं:

$ cat folders | xargs -I % find . -type d -name % | xargs ls
./Documents/dir1:
file1  file2  file3  file4

./Documents/dir2:
file1  file2  file3  file4

./Documents/dir3:
file1  file2  file3  file4

./Documents/dir4:
file1  file2  file3  file4

मेरी राय में xargs, मुझे लगता है कि खोजने से अधिक बहुमुखी लगता है। इसके अलावा आप कुछ पागल सामान बना सकते हैं जैसे

$ cat << EOF | xargs -I {} find ~ -name "{}" | xargs ls
> dir1
> dir2
> dir3
> EOF
/home/user/Documents/dir1:
file1  file2  file3  file4

/home/user/Documents/dir2:
file1  file2  file3  file4

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