find
( -name
/ -path
मानक विधेय के लिए) ग्लब्स की तरह वाइल्डकार्ड पैटर्न का उपयोग करता है (ध्यान दें कि {a,b}
ग्लोब ऑपरेटर नहीं है; विस्तार के बाद, आपको दो ग्लब्स मिलते हैं)। मुख्य अंतर स्लैश (और डॉट फाइलें और dirs विशेष रूप से इलाज नहीं किया जा रहा है find
) की हैंडलिंग है । *
ग्लोब में कई निर्देशिकाओं का विस्तार नहीं होगा। */*/*
सूचीबद्ध करने के लिए निर्देशिकाओं के 2 स्तरों तक कारण होगा। जोड़ना -path './*/*/*'
किसी भी फाइल से मेल खाएगा जो कम से कम 3 स्तर गहरे हों और find
किसी भी निर्देशिका की सामग्री को किसी भी गहराई में सूचीबद्ध करने से नहीं रोकेंगे।
उस विशेष के लिए
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
ग्लब्स की जोड़ी, अनुवाद करना आसान है, आप गहराई 3 पर निर्देशिकाएं चाहते हैं, ताकि आप उपयोग कर सकें:
find . -mindepth 3 -maxdepth 3 \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
(या -depth 3
कुछ find
कार्यान्वयन के साथ )। या पॉसली:
find . -path './*/*/*' -prune \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
कौन सा गारंटी हैं उन है कि *
और ?
मिलान नहीं हो पाया /
अक्षर।
( find
, ग्लब्स के विपरीत, foo*bar
मौजूदा डाइरेक्टरी में अन्य के अलावा निर्देशिकाओं की सामग्री को पढ़ा जाएगा , और फ़ाइलों की सूची को क्रमबद्ध नहीं किया जाएगा। लेकिन अगर हम इस समस्या को छोड़ देते हैं कि अमान्य वर्णों के संबंध [A-Z]
में *
/ के ?
साथ या उसके व्यवहार से क्या मेल खाता है)। अनिर्दिष्ट, आपको फ़ाइलों की एक ही सूची मिलेगी)।
लेकिन किसी भी मामले में, जैसा कि @ मुरु ने दिखाया है , सिस्टम कॉल find
की सीमा के आसपास काम करने के लिए कई रनों में फ़ाइलों की सूची को विभाजित करने के लिए केवल इसका सहारा लेने की आवश्यकता नहीं है execve()
। कुछ गोले जैसे zsh
(के साथ zargs
) या ksh93
(के साथ command -x
) भी उस के लिए बनाया समर्थन है।
साथ zsh
(जिसका भी globs के बराबर है -type f
और अधिकांश अन्य find
विधेय), उदाहरण के लिए:
autoload zargs # if not already in ~/.zshrc
zargs ./foo*bar/quux[A-Z](|.bak)/pic[0-9][0-9][0-9][0-9]?.jpg(.) -- cmd
( (|.bak)
इसके विपरीत एक ग्लोब ऑपरेटर है {,.bak}
, (.)
ग्लोब क्वालीफायर find
's के बराबर है -type f
, oN
इसमें जैसे-जैसे छंटनी छोड़ना चाहते हैं find
, D
डॉट-फाइल्स शामिल करना (इस ग्लोब पर लागू नहीं होता है))
Like find
ग्लोब जैसे डायरेक्टरी ट्री को क्रॉल करने के लिए आपको कुछ इस तरह की आवश्यकता होगी:
find . ! -name . \( \
\( -path './*/*' -o -name 'foo*bar' -o -prune \) \
-path './*/*/*' -prune -name 'pic[0-9][0-9][0-9][0-9]?.jpg' -exec cmd {} + -o \
\( ! -path './*/*' -o -name 'quux[A-Z]' -o -name 'quux[A-Z].bak' -o -prune \) \)
यह स्तर 1 को छोड़कर सभी निर्देशिकाओं को prune कर रहा foo*bar
है, और सभी स्तर 2 को छोड़कर quux[A-Z]
या quux[A-Z].bak
लोगों को छोड़कर , और फिर pic...
स्तर 3 पर लोगों का चयन करें (और उस स्तर पर सभी निर्देशिकाओं को prune करें)।
-path
या-ipath
।find . -path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg'
काम करना चाहिए - सिवाय इसके कि यह मेल खाएगा/fooz/blah/bar/quuxA/pic1234d.jpg
। क्या यह एक समस्या हो सकती है?