इसलिए यूनिक्स का निम्नलिखित व्यवहार मुझे महँगा लगता है:
> touch foo
> touch bar
> ls
bar foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?
इसका अर्थ कैसे निकलता है?
इसलिए यूनिक्स का निम्नलिखित व्यवहार मुझे महँगा लगता है:
> touch foo
> touch bar
> ls
bar foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?
इसका अर्थ कैसे निकलता है?
जवाबों:
खोज की कमांड लाइन विभिन्न प्रकार के विकल्पों से बनाई गई है, जो कि अभिव्यक्ति के रूप में संयुक्त हैं।
find
विकल्प -delete
एक क्रिया है।
इसका मतलब है कि यह अब तक मिलान की गई प्रत्येक फ़ाइल के लिए निष्पादित किया गया है।
रास्तों के बाद पहले विकल्प के रूप में, सभी फाइलों का मिलान किया जाता है ... उफ़!
यह खतरनाक है - लेकिन मैन पेज कम से कम एक बड़ी चेतावनी है :
से man find
:
ACTIONS
-delete
Delete files; true if removal succeeded. If the removal failed, an
error message is issued. If -delete fails, find's exit status will
be nonzero (when it eventually exits). Use of -delete automatically
turns on the -depth option.
Warnings: Don't forget that the find command line is evaluated as an
expression, so putting -delete first will make find try to delete
everything below the starting points you specified. When testing a
find command line that you later intend to use with -delete, you
should explicitly specify -depth in order to avoid later surprises.
Because -delete implies -depth, you cannot usefully use -prune and
-delete together.
और आगे से man find
:
EXPRESSIONS
The expression is made up of options (which affect overall operation rather
than the processing of a specific file, and always return true), tests
(which return a true or false value), and actions (which have side effects
and return a true or false value), all separated by operators. -and is
assumed where the operator is omitted.
If the expression contains no actions other than -prune, -print is per‐
formed on all files for which the expression is true.
एक find
कमांड क्या करेगी:
यह देखने के लिए कि क्या कमांड पसंद है
find . -name '*ar' -delete
हटा देगा, आप पहले क्रिया -delete
को अधिक हानिरहित क्रिया द्वारा बदल सकते हैं - जैसे -fls
या -print
:
find . -name '*ar' -print
यह प्रिंट करेगा कि कौन सी फाइलें कार्रवाई से प्रभावित हैं।
इस उदाहरण में, -प्रिंट को छोड़ा जा सकता है। इस मामले में, कोई कार्रवाई नहीं है, इसलिए सबसे स्पष्ट रूप से स्पष्ट रूप से जोड़ा जाता है -print
:। (ऊपर उद्धृत "खंड" का दूसरा पैराग्राफ देखें)
-delete
ध्वज जोड़ने के लिए इतना सीधा लग रहा था :-) लेकिन क्या कोई कारण है जो कभी भी किसी और के find . -delete
बजाय होगा rm -rf .
? या क्या ऐसा ही होता है जिस तरह से find
पर्स और उसके तर्कों को संसाधित करता है?
warning: use -depth when testing stuff you later want to -delete
जो आपने अपने व्यावहारिक पक्ष उदाहरण पर नहीं किया है?
-n
विकल्प की तरह -delete के स्थान पर प्रिंट के उपयोग को स्पष्ट करने के लिए था ; पहले कमांड का बिल्कुल भी व्यावहारिक उपयोग नहीं होना चाहिए; मैं इसे बदल दूँगा।
में find
तर्क क्रम मायने रखती है, एक बहुत।
तर्क विकल्प, परीक्षण और कार्य हो सकते हैं। आपको आमतौर पर पहले विकल्पों का उपयोग करना चाहिए, फिर परीक्षण, फिर कार्यों का।
कभी-कभी find
आपको संभावित खराब ऑर्डरिंग के बारे में भी चेतावनी देता है (उदाहरण के लिए जब आप -maxdepth
अन्य तर्कों के बाद उपयोग करते हैं), लेकिन दूसरों को लगता है कि यह नहीं है।
क्या find . -delete -name '*ar'
है:
आप शायद क्या करना चाहते हैं:
find -name '*ar' -delete
यह, प्रत्येक फ़ाइल के लिए, यह देखेगा कि क्या यह मेल खाता है '*ar'
, और केवल अगर यह शर्त को पूरा करता है तो यह फ़ाइल को हटा देगा।
क्षमा करें यदि आपको बहुत देर से पता चला।