यूनिक्स: निर्देशिका नामों के बाद स्लैश या नहीं


13

निम्नलिखित आज्ञाओं में क्या अंतर है?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

या कोई अंतर नहीं है? या यह इस्तेमाल की जा रही कमांड पर निर्भर करता है? उदाहरण के लिए सोचें कि मैंने पढ़ा कि आपके द्वारा उपयोग किए जाने वाले संस्करण के आधार पर rsync व्यवहार थोड़ा बदलता है। क्या किसी के पास एक अच्छी व्याख्या है इसलिए मुझे अब अनुमान लगाने की ज़रूरत नहीं है और मुझे लगता है कि मुझे पता है कि मैं क्या कर रहा हूं?


2
यह rsync के लिए सही है। यह या तो निर्देशिका के साथ या इसके अंतर्गत आने वाली वस्तुओं के साथ कॉपी करना शुरू करता है, इस पर निर्भर करता है कि आप क्रमशः अनुगामी स्लैश को छोड़ते हैं या जोड़ते हैं।
मैक्सिलोस्ट

@ मोमैक्सोस्ट: क्या आप कुछ उदाहरणों के साथ उत्तर जोड़ सकते हैं ताकि यह स्पष्ट हो सके कि क्या होता है?
शविश

मिकेल ने इसका उत्तर स्पष्ट रूप से नीचे दिया, मुझे लगता है।
अधिकतम

जवाबों:


17

कई यूनिक्स उपयोगिताओं एक अनुगामी स्लेश है कि क्या पर निर्भर करता है सहानुभूति का इलाज।

यह व्यवहार POSIX प्रतीकात्मक लिंक प्रलेखन में वर्णित है और GNU कोरुटिल्स प्रलेखन में भी वर्णित है ।

मूल रूप से, अनुगामी स्लैश का अर्थ सिमिलिंक का पालन करना (या "डीरेफरेंस") है।

उदाहरण के लिए, नीचे दिए गए कोड में, dirlinkसिम्लिंक का अर्थ है, लेकिन dirlink/इसका अर्थ है कि सिम्लिंक निर्देशिका को इंगित करता है। rmजब तक आप नहीं कहते rm -r, तब तक कोई निर्देशिका नहीं निकालेगा , लेकिन rmविकल्प के बिना खुशी से एक सिमलिंक निकाल देगा।

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

यह निर्देशिका की अनुमतियों को देखने के लिए भी उपयोगी है, यह परेशान किए बिना कि निर्देशिका एक वास्तविक निर्देशिका है या केवल एक निर्देशिका के लिए सिम्लिंक है।

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

और यह अभी भी नियमित निर्देशिका के लिए काम करता है:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

एक और उदाहरण है findकमांड। यदि pathआप इसे सर्च करने के लिए कहते हैं, तो यह एक सिमलिंक है, यह डिफ़ॉल्ट रूप से सिमलिंक का पालन नहीं करेगा, इसका अर्थ यह है कि यह केवल सिमलिंक को संसाधित करता है। अनुगामी स्लैश को जोड़ने से यह सिम्लिंक को उस निर्देशिका के रूप में व्यवहार करता है जो लिंक को इंगित करता है।

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(खोज के कुछ संस्करणों में एक विकल्प -followया -Lविकल्प होता है, लेकिन यह सभी सिम्लिंक का अनुसरण करता है, न कि पहले वाले)


के मामले में rsync, क्या आपको एक स्लैश को जोड़ना चाहिए यह इस बात पर निर्भर करता है कि आप चाहते हैं कि जिस निर्देशिका को आप कॉपी कर रहे हैं वह एक उपनिर्देशिका है या नहीं।

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

दूसरे शब्दों में:

  • rsync dir dir.bakप्रतियां dirमें dir.bak, बनाने dirके अंदरdir.bak
  • rsync dir/ dir.bakअंदर dirकिए बिना, की सभी सामग्रियों की प्रतिलिपि बनाता dirहैdir.bak

2

जैसा कि पहले से ही jsalonen ने कहा, इन आदेशों का वास्तव में समान परिणाम होता है, fooऔर bar, तथ्य की बात है, निर्देशिका के रूप में।

हालांकि, अगर fooऔर barनिर्देशिका नहीं हैं, फिर कमांड यदि आप स्लैश संलग्न विफल हो जाएगा, और यदि आप ऐसा नहीं करते सफल होगा। बात यह है, यदि आदेश सफल होता है, तो यह संभवतः आपके इच्छित परिणाम नहीं होगा। वास्तव में, आप डेटा खो भी सकते हैं यदि fooऔर barफ़ाइलें हैं ( barअधिलेखित कर दी जाएंगी)।

यदि आपका इरादा निर्देशिकाओं को निर्दिष्ट करना है और फाइलों को नहीं, तो आपको एक पीछे चल रहे स्लैश का उपयोग करना चाहिए , क्योंकि यह कमांड को अधिक मजबूत बनाता है: यदि उम्मीद fooया कि barनिर्देशिका विफल हो जाती है, तो अप्रत्याशित परिणाम होने के बजाय, कमांड इनायत से विफल हो जाएगा।

इसके अलावा, कुछ (दुर्लभ) आदेश एक अनुगामी स्लेश की उपस्थिति के आधार पर अलग-अलग व्यवहार करते हैं, यहां तक ​​कि निर्देशिकाओं के साथ (एक उदाहरण है rsync)।


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