-R और -R के बीच का अंतर


32

अक्सर ऐसा होता है कि मैं एक ऑपरेशन को पुनरावर्ती रूप से लागू करना चाहता हूं। कुछ कमांड, जैसे कि grep, पुनरावर्तन को इंगित करने के लिए एक लोअरकेस आर का उपयोग करते हैं। उदाहरण के लिए

grep -r foo .

अन्य आदेश एक अपरकेस आर को पसंद करते हैं:

chmod -R 755 .

मैं लगातार इन गलत तरीके से इधर-उधर हो रहा हूं और भूल रहा हूं कि कौन सी है। क्या इन तर्कों के लिए मामले के चयन के पीछे कोई तर्क है?


1
"क्योंकि कोडर्स को लगा कि यह समझदार है।" (यह नहीं कह रहा है कि यह एक अच्छा कारण है, लेकिन शायद यही सच है)
HalosGhost

1
इसके लायक क्या है, हालांकि कई आदेशों को समझने के लिए नहीं लगता है --recursive, वे गलत काम करने की संभावना नहीं रखते हैं।
टेनर स्विफ्ट

जवाबों:


37

अधिकांश POSIX आदेशों है कि पुनरावर्ती निर्देशिका ट्रावर्सल विकल्प ( ls, chmod, chgrp, chmod, cp, rm) है -Rकि के लिए।

rmयह भी -rक्योंकि POSIX से बहुत पहले यह शुरू में था।

अब, व्यवहार भिन्न होता है जब पेड़ के नीचे चलने में सीमलिंक पाए जाते हैं। POSIX ने -L/ -H/ Pविकल्पों को जोड़कर चीजों को लगातार बनाने की कोशिश की, ताकि उपयोगकर्ता को यह तय करने का मौका दिया जा सके कि कोई भी अनिर्दिष्ट प्रदान किए जाने पर डिफ़ॉल्ट को छोड़कर सहानुभूति के साथ क्या करना है।

POSIX grepमें कोई -rया नहीं है -R

GNU grepशुरू में न तो था। -r1998 में जोड़ा गया था। यह सहानुभूति का पालन कर रहा था।

-Rअन्य उपयोगिताओं के साथ स्थिरता के लिए 2001 में एक पर्याय के रूप में जोड़ा गया था। यह अभी भी सहानुभूति का पालन कर रहा था।

2012 में (grep 2.12), -r को बदल दिया गया था इसलिए इसे अब सहानुभूति का पालन नहीं किया गया, संभवतः -L, क्योंकि -Hपहले से ही कुछ और के लिए उपयोग किया जाता था।

बीएसडी grepलंबे समय तक जीएनयू ग्रिप पर आधारित थे। उनमें से कुछ ने अपने स्वयं के पुनर्लेखन किए हैं और जीएनयू के साथ कम या ज्यादा संगतता बनाए रखी है grep। Apple OS / X ने सिमिलिंक समस्या को अलग तरीके से संबोधित किया। -rऔर -Rसमान हैं और सहानुभूति का पालन नहीं करते हैं। -Sहालाँकि एक विकल्प है जो सिम्बलिंक का पालन करने के लिए chmod/ cp/ findके -Lविकल्प की तरह काम करता है ।


13
टीएल; डीआर : इतिहास।
सैममिच

10
प्रारंभिक इतिहास: rmदूसरों के सामने एक पुनरावर्ती विकल्प था। यह था -r। फिर cpएक मेल मिला -r। फिर lsएक पुनरावर्ती विकल्प रखना चाहता था, लेकिन ls -rपहले से ही "रिवर्स सॉर्ट" का मतलब था , इसलिए यह होना चाहिए था -R। वहां के बीच तनाव -Rऔर -rशुरू हुआ। -Rकेवल वही था जिसे हर प्रासंगिक उपयोगिता में लगातार जोड़ा जा सकता rm -rथा , लेकिन पहले से ही प्रसिद्ध पारंपरिक उपयोग था। तब GNU साथ आया और कहा "स्थिरता और परंपरा चौकों के लिए है, आदमी!"

8

कोई भी नहीं, कुछ भी नहीं। यह केवल इस बात पर निर्भर करता है कि डेवलपर्स ने क्या चुना। यह अक्सर क्योंकि दोनों है -rऔर -Rवैध विकल्प हैं। उदाहरण के लिए, आपके द्वारा उद्धृत कार्यक्रमों में:

  • GNU के हाल के संस्करण grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
    
    -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.
    
  • chmodकोई -rविकल्प नहीं है, संभवतः, देवता पसंद करते हैं -R। हालाँकि, निश्चित रूप से, -rएक वैध अनुमतियाँ स्ट्रिंग है (जैसा कि @Arkadiusz Drabczykso द्वारा बताया गया है) इसलिए यह वास्तव में वहाँ इस्तेमाल नहीं किया जा सकता है।


आपका grepसंस्करण क्या है ? GNU grep 2.12, -rऔर -Rसमान हैं। Chmod के साथ, -RPOSIX द्वारा परिभाषित किया गया है।
cuonglm

@Gnouc grep (GNU grep) 2.15और मुझे पिछले संस्करणों में यह याद है। क्या आप सुनिश्चित हैं कि यह आपके मामले में नहीं है? वे ज्यादातर मामलों में अनिवार्य रूप से एक ही परिणाम प्रदान करते हैं, वे केवल लिंक के साथ अलग व्यवहार करते हैं। के लिए के रूप में chmod, यह अच्छी तरह POSIX से परिभाषित किया जा सकता है, लेकिन है कि अभी भी है, शायद, क्योंकि मूल chmoddevs चुना Rअधिक r
terdon

2
@ ग्नुक डी'ओह! जाहिर है, वे उपयोग नहीं कर सकते -rक्योंकि पहले से ही एक वैध अनुमति स्ट्रिंग है।
terdon

3

ज्यादातर, यह एक डेवलपर की व्यक्तिगत प्राथमिकता के लिए आता है। कभी-कभी, हालांकि, एक अपरकेस विकल्प चुना जाता है यदि पसंदीदा लोअरकेस विकल्प कुछ और के लिए लिया जाता है जो डेवलपर्स का मानना ​​है कि तुलना में अधिक महत्वपूर्ण है, उदाहरण के लिए, पुनरावर्ती रूप से काम करना। Chmod के मामले में -rएक वैध मोड है। उदाहरण के लिए:

$ ll FILE
-rw-r--r-- 1 ja ja 0 Sep  9 16:42 FILE
$ chmod -r FILE
$ ll FILE
--w------- 1 ja ja 0 Sep  9 16:42 FILE

1

मैं लगातार इन गलत तरीके से इधर-उधर हो रहा हूं और भूल रहा हूं कि कौन सी है।

जहाँ संभव हो, इन उपयोगिताओं के GNU संस्करणों का उपयोग करें और फिर आप विकल्पों के लिए लंबे नामों का उपयोग कर सकते हैं।

command --recursive

क्या इन तर्कों के लिए मामले के चयन के पीछे कोई तर्क है?

नहीं।

या ज्यादा नहीं। यूनिक्स उपयोगिताओं को विकसित किया गया था और कमांड विकल्प उनके लीड या एकमात्र डेवलपर्स के व्यक्तिगत विकल्पों को दर्शाते हैं। केवल 26 ASCII लोअर-केस विकल्प पत्र उपलब्ध हैं, जो पसंदीदा सेट है (टाइपिंग की आसानी के लिए कमांड आमतौर पर लोअर केस में होते हैं), और इस सीमित सेट से मेनेमोनिक संघर्ष होता है। विरोधाभासों के कारण असंगतता पैदा होती है क्योंकि कमांड / उपयोगिताओं के नए संस्करणों ने नई सुविधाएँ प्राप्त की हैं ।


-1

20 साल पहले जब मैंने UNIX सीखा था, तो मेरे गुरु ने मुझसे इस तरह कहा था: "आप हमेशा अपरकेस आर में रिकर्सिव ऑप्शन टाइप करना बेहतर होगा। क्योंकि लोअरकेस विकल्प पर कुछ कमांड्स के अलग-अलग अर्थ होते हैं, लेकिन अपरकेस आर ज्यादातर रिकर्सिव ऑप्शन के लिए होता है। हर जगह। और यह आपको आर लिखने पर शिफ्ट-की को दबाकर परेशान करने से [rm * -Rf] पर सतर्क रहने की अच्छी आदत देगा। "


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