क्या है गायब-तर्क?


15

मैं 30 दिनों से अधिक पुरानी निर्देशिका, फ़ाइलों और निर्देशिकाओं को साफ़ करने के लिए निम्न आदेश का उपयोग करता हूं, और उन्हें एक संग्रह निर्देशिका में स्थानांतरित करता हूं, जिसे मैं कुछ हफ्तों के बाद हटा सकता हूं यदि कोई भी उनकी फ़ाइलों को वापस नहीं मांगता है। लक्ष्य निर्देशिका में उपयोगकर्ता नाम द्वारा उपनिर्देशिकाएं हैं, इसलिए संग्रह निर्देशिका होगी।

यह वह कमांड है जिसका मैं उपयोग करता हूं:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

मैं ubuntu पूछने पर एक सवाल का जवाब देने के लिए इस का एक संशोधित संस्करण का सुझाव दिया, किसी अन्य उपयोगकर्ता पंक्ति के अंत बदलने के लिए कोड संपादित \;करने के लिए +यह तेजी से है के रूप में (और अधिक सही?)। यहाँ देखें

हालाँकि, +इस तरह से उपयोग करना काम करता है यदि -execकमांड है ls -lhलेकिन वास्तविक कमांड में नहीं है जो मैं उपयोग करता हूं। अगर मैं इसे +एक त्रुटि संदेश के साथ आज़माता हूँ:

find: missing argument to '-exec'

मुझे समझ में नहीं आ रहा है कि यह इस तरह क्यों व्यवहार कर रहा है, या सही कमांड क्या होगा। कृपया केवल एक कमांड सुधार पोस्ट न करें, मैं केवल एक सुझाव का आँख बंद करके पालन करने के बजाय समझना चाहूंगा।


क्या आप इस जवाब का जिक्र कर रहे हैं ? यह समझा सकता है कि क्यों
Wilf

धन्यवाद @Wilf मैंने यह दिखाने के लिए अद्यतन किया है कि कौन सा उत्तर संपादित हुआ। आपके द्वारा प्रदान किया गया लिंक, एक और लिंक है जो इसे इस तरीके से समझाता है जिससे मेरा मस्तिष्क सामना कर सके।
आर्कलिकल जूल


धन्यवाद @souravc एक शानदार ढंग से चक्रीय तरीके से उस प्रश्न के लिए जो उपयोगकर्ता ने मेरी कमांड को संपादित किया है! अंत में मुझे लगता है कि यह +एक ही कमांड में कई तर्कों की आपूर्ति करता है, लेकिन mvइसके साथ सामना नहीं कर सकता!
अरैलिकल जूल

@ एरॉनिकल एमवी, मेरा जवाब देख सकते हैं ^ ^
अराजकता

जवाबों:


19

उस पोस्ट में उपयोगकर्ता कह सकता है कि +एक -execकमांड के अंत में संकेत तेज़ है, लेकिन क्यों नहीं।

मान लें कि findकमांड निम्नलिखित फाइलें लौटाता है:

/path/to/file1
/path/to/file2
/path/to/file3

सामान्य -execकमांड ( -exec command {} \;) प्रत्येक मिलान फ़ाइल के लिए एक बार चलती है। उदाहरण के लिए:

find ... -exec mv {} /target/ \;

निष्पादित करता है:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

यदि आप +साइन का उपयोग करते हैं ( -exec command {} +) कमांड का निर्माण कमांड के अंत में कई मिलान की गई फ़ाइलों को जोड़कर किया जाता है। उदाहरण के लिए:

find ... -exec mv -t /target/ {} +

निष्पादित करता है:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

+ध्वज को सही ढंग से उपयोग करने के लिए प्रक्रिया के तर्क को कमांड के अंत में होना चाहिए, बीच में नहीं। इसलिए आपके उदाहरण में findचड्डी missing argument to '-exec'है; यह बंद याद आती है {}


मैंने हमेशा सोचा है कि आखिरी arg होने की find -execआवश्यकता क्यों है {}, जब इसके साथ प्रयोग किया जाता है +। किसी को पता है कि ओपी की कमांड लाइन जैसे निर्माणों को काम करने देने के बजाय उस डिजाइन का निर्णय क्यों किया गया?
पीटर कॉर्डेस

11

यूजर ने समझाया उनका एडिट…।

'+' का निष्पादक '\' की तुलना में तेज़ है  देखें /ubuntu/558817/what-is-the-difference-between-use-and-in-exec-command;  और मूल फ़ाइल से बैकअप फ़ाइल बनाना अच्छा विचार है

... इस लिंक का उपयोग कर । मुझे लगता है कि मूल रूप से कई आदेशों का उपयोग करने के बजाय, यह सभी फ़ाइलनामों को एक कमांड उदाहरण के लिए, चीजों को गति देने के लिए भेजता है। यहाँ एक उदाहरण यहाँ दिया गया है :

अर्धवृत्त ( find . -exec ls '{}' \;) के साथ -exec का उपयोग , निष्पादित करेगा

ls file1
ls file2
ls file3

लेकिन अगर आप इसके बजाय एक प्लस चिह्न ( find . -exec ls '{}' \+) का उपयोग करते हैं , तो सभी फ़ाइलनामों को एक ही आदेश के तर्क के रूप में पारित किया जाएगा:

ls file1 file2 file3

वहाँ ;और +साथ ही उपलब्ध अन्य रूपों का उपयोग कर रहे हैं :)

इसलिए कमांड को खोजने के लिए निम्नलिखित उदाहरण वाक्यविन्यास की अनुमति है:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

फिर भी, मुझे यकीन नहीं है कि यह वैसे भी कमांड के साथ काम करेगा, क्योंकि यह सिंटैक्स है mv [OPTION]... SOURCE DEST, जब तक कि -tविकल्प या समान का उपयोग नहीं किया जाता है। हालाँकि, इसे lsबिना किसी अतिरिक्त विकल्प के साथ काम करना चाहिए क्योंकि वे समझ सकते हैं कि कब कई फाइलनाम दिए गए हैं। +भी भाग निकले करना पड़ सकता है (यानी \+)


दोनों महान जवाब, लेकिन मैं इसे एक छोटे से तेज होने के लिए अराजकता देने के लिए मिल गया हूं, और mv -tहालांकि, दोनों + 1s को समझा रहा हूं !
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.