लिनक्स लगातार कई पथ विभाजकों (/ home //// उपयोगकर्ता नाम /// फ़ाइल) को कैसे संभालता है?


111

मैं एक पायथन स्क्रिप्ट पर काम कर रहा हूं, जो फ़ाइल स्थानों को एक scp उपप्रोसेस से गुजरती है। यह सब ठीक है, लेकिन मैं ऐसी स्थिति में हूं जहां मैं एक फ़ाइलनाम के साथ एक पथ को समाप्त कर सकता हूं, जैसे कि /मार्ग में एक डबल ' । मुझे पता है कि अगर आपके पास कई फ़ाइल विभाजक हैं, तो bash परवाह नहीं करता है, लेकिन मैं सोच रहा हूं कि यह कैसे ठीक किया गया है। क्या यह बैश है जो अतिरिक्त /एस स्ट्रिप्स करता है या क्या यह वास्तव में कभी मायने नहीं रखता है?

मैं पूछता हूं क्योंकि यह मुझे /समवर्ती करते समय अतिरिक्त एस की जांच करने के लिए कोड की कई पंक्तियों को बचाएगा । मुझे पता है कि यह कोई बड़ी बात नहीं है, लेकिन मैं उत्सुक हूं। मेरे पास एक बैश स्क्रिप्ट है जिसमें लाइन है cd //usr(इसके बजाय cd /usr), जो कि लगता है कि /एक पथ में कई का उपयोग करने के लिए एक महत्व हो सकता है


7
मैं कोड की अतिरिक्त पंक्तियों में निवेश करूँगा ...
स्टीफन

5
बस मामले में किसी को भी परवाह करता है, जो मुझे यकीन है कि कोई भी करता हूँ, मैं वास्तव में अजगर का उपयोग कर अंत गए joinऔर abspathऔर इस तरह के आदेशों।
फाल्मरी

जवाबों:


165

एकाधिक स्लैश की अनुमति है और एक स्लैश के बराबर है। से एकल यूनिक्स विशिष्टता (संस्करण 3) , आधार परिभाषाओं §3.266 पथ नाम : "। एकाधिक लगातार स्लैश एक स्लेश के रूप में ही माना जाता है"

एक अपवाद है: यदि एक pathname बिल्कुल दो स्लैश के साथ शुरू होता है, तो इसका अलग तरीके से इलाज किया जा सकता है (Ref: base definitions name4.11 pathname resolution )। लिनक्स स्वयं ऐसा नहीं करता है, हालांकि कुछ एप्लिकेशन और अन्य यूनिक्स-ईश प्रणाली करते हैं (जैसे Cygwin)।

एक पाथनाम /के अंत में एक अनुगमन एक निर्देशिका को संदर्भित करने के लिए पथनाम को बाध्य करता है। In ( POSIX 1003.1-2001 (Single Unix v3) आधार परिभाषाएँ OS4.11 पाथनाम रिज़ॉल्यूशन , एक अनुगामी एक अनुगामी /के बराबर है /.POSIX 1003.1-2008 (Single Unix v4) आधार परिभाषाएँ §4.12/. क्रम में, इसे क्रम में समतुल्य बनाने के लिए आवश्यकता को हटा देती है। गैर-मौजूदा निर्देशिकाओं के साथ सामना करने के लिए (जैसे mkdir foo/काम करने के लिए आवश्यक है, जबकि mkdir foo/.- परिवर्तन के लिए तर्क नहीं देखें )।

निर्देशिका प्रविष्टि पर कार्य करने वाले कार्यक्रमों के लिए, यदि किसी निर्देशिका का fooप्रतीकात्मक लिंक है, तो पासिंग foo/एक तरह से प्रतीकात्मक लिंक के बजाय प्रोग्राम पर कार्य करने का एक तरीका है।

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


7
/.बाद की चर्चा प्रक्रिया के बाद इसे समकक्ष हटा दिया गया क्योंकि यह अस्पष्ट था। वैसे भी +1 इस प्रकार की जानकारी को अच्छी तरह से संक्षेप में प्रस्तुत करना कठिन है।
हक्रे

17

ओएस इसकी परवाह नहीं करता है, या तो रास्ते में एक // के साथ खोलने के लिए एक प्रत्यक्ष syscall के साथ एक सी कार्यक्रम की कोशिश कर रहा है।

आप इसे सामान्य करने के लिए अजगर लाइब्रेरी फंक्शन os.path.normpath का उपयोग कर सकते हैं, जो आपको एक्स्ट्रा की तलाश में स्ट्रिंग के माध्यम से स्कैन करने के लिए बचाता है। अन्य भाषाओं में समान कार्य हैं।

http://docs.python.org/library/os.path.html#os.path.normpath


5
मानदंड के स्रोत में निम्नलिखित टिप्पणी से सावधान रहें: एक पथ को सामान्य करें, जैसे A // B, A /./ B और A / foo /../ B सभी A / B बनें। यह समझा जाना चाहिए कि यह पथ के अर्थ को बदल सकता है अगर इसमें प्रतीकात्मक लिंक होते हैं!
ब्लूहॉर्न

8

सभी यूनिक्स सिस्टम पर जो मैंने देखा है वह एकल के समान है /, लेकिन यूनिक्स मानक यह निर्दिष्ट करता है

एक पाथनाम जो दो क्रमिक स्लैश के साथ शुरू होता है, एक कार्यान्वयन-परिभाषित तरीके से व्याख्या की जा सकती है, हालांकि दो से अधिक प्रमुख स्लैश को एक स्लैश के रूप में माना जाएगा।

इसलिए यह विशेष रूप से आपके सिस्टम पर निर्भर करता है। (कुछ पुराने यूनिक्स संस्करणों ने /रिमोट फाइल सिस्टम एक्सेस के लिए एक डबल लीडिंग का उपयोग किया, और अभी भी कुछ ऐसा हो सकता है।)


7
साइग्विन (जबकि एक वास्तविक यूनिक्स नहीं) //remote/...दूरस्थ फाइल सिस्टम एक्सेस का अनुवाद करता है , शायद विंडोज के साथ संगति के लिए \\remote\...
ईपीमिएंट

2
मेरा मानना ​​है (लेकिन अभी एक अच्छे संदर्भ को गूगल नहीं कर सकता है) कि विंडोज पॉसक कॉम्पिटिटर एपीआई भी //remote/...यूएनसी पथ \\remote\...प्रारूप के समान होगा ।
स्टीफन पी

1
मुझे लगता है कि मुझे याद है कि Boost.Filesystem के पोर्टेबल पाथनेम्स //एक विशेष तरीके से हैंडल करते हैं , जिसमें वे falseयूनिक्स / POSIX कल्पना के अनुरूप निरपेक्ष होने के लिए परीक्षण कर सकते हैं ।

7

os.path.joinपायथन में उपयोग करें और आपको कई स्लैश नहीं मिलेंगे। स्ट्रिंग्स को समतल करके अपने आप को फाइलनाम बनाना खराब पायथन शैली माना जाता है।


मैं सहमत हूं, लेकिन फ़ाइल नाम एक कमांड स्ट्रिंग का हिस्सा है, और कमांड स्ट्रिंग को फ़ाइलनाम (अंत में) पर अपग्रेड करने के बजाय, मैं इसे जोड़ना चाहूंगा।
फल्मरी

1
@Falmarri: आप केवल कमांड स्ट्रिंग पर फ़ाइल नाम नहीं जोड़ सकते हैं! एक कमांड स्ट्रिंग शेल द्वारा पार्स की जाएगी, इसलिए फ़ाइल नामों में विशेष वर्णों को उद्धृत किया जाना चाहिए। तो आपको फ़ाइल नाम का निर्माण करने की आवश्यकता है, फिर इसे कमांड स्ट्रिंग में डालने के लिए ठीक से उद्धृत करें।
गिलीस

यह वास्तव में विशिष्ट परियोजना है जिसका मैं बहुत अधिक उपयोग कर रहा हूं। मैं शायद इस बारे में मजबूत नहीं होने के लिए पर्याप्त स्पष्ट नहीं किया गया है। मुझे यह फाइल पथ स्ट्रिंग एक वर्ग से मिल रही है जो मुझे सही ढंग से बची हुई फ़ाइल पथ और इस तरह देता है। और मैं इसे कमांड लाइन तर्क के लिए
जोड़

1
@Falmarri: तो आप कमांड-लाइन मान को साफ करने के लिए मानदंड का उपयोग करें जिसे आप नियंत्रित नहीं करते हैं, और फिर उन्हें एक साथ रखने के लिए शामिल होने का उपयोग करें।
नील मैय्यू

यह वास्तव में मैं क्या कर रहा था = \ _ मैं उस विशेष मामले को नहीं संभाल सका जहां मुझे /बहुत अच्छा दिया गया था ।
फल्मरी

3

इसमें कोई फर्क नही है।

एकाधिक स्लैशों को अनदेखा किया जाता है (बिना प्रभाव के), जैसे:

ls -al //usr///////bin/sed

7
वहाँ कर सकते हैं अगर यह ठीक दो है और शुरू में होना चाहिए; एक पाथनाम जो दो क्रमिक स्लैश के साथ शुरू होता है, एक कार्यान्वयन-परिभाषित तरीके से व्याख्या की जा सकती है । अभ्यास में मुझे लगता है कि यह सही है और वे बस को नजरअंदाज कर दिया हो
माइकल Mrozek

धन्यवाद क्रिस, मैं स्पष्टीकरण की सराहना करता हूं! (दुर्भाग्य से OpenID लॉगिन मेरे लिए काम नहीं कर रहा है या मैं आपको वोट

@Rob आप अपंजीकृत हैं, लेकिन फिर भी लॉग इन (आप अपनी कुकी द्वारा ट्रैक किए जाते हैं)। आप अपने खाते में एक OpenID कनेक्ट करने के लिए अब पंजीकरण करने में सक्षम होना चाहिए, लेकिन आप किसी भी तरह से मतदान करने में सक्षम होना चाहिए
माइकल Mrozek

धन्यवाद माइकल, लेकिन "आपको लॉग इन या वोट करने के लिए पंजीकरण करना होगा"। जब आप सिर्फ एक ईमेल पते और नाम का उपयोग करते हैं तो आपके पास पूर्ण विशेषाधिकार नहीं होते हैं। और चूंकि OpenID समय समाप्त हो रहा है और मुझे ऐसा कोई अन्य खाता बनाने का मन नहीं है, इसलिए मैं भाग्य से बाहर हूं। आलसी होने के लिए मेरी गलती मुझे लगता है, लेकिन मैं मदद की सराहना करता हूं।

0

निश्चित रूप से आप इसमें से गुजरने वाले संभावित कई / (स्लैश) के साथ एक मार्ग को सामान्य कर सकते हैं tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... और फिर उपयोग करें $NORMALIZED

हालांकि, यह आवश्यक होना चाहिए। जैसा कि मुझे पता है कि किसी भी ठीक से UNIX कर्नेल को समवर्ती पथ विभाजकों को अनदेखा करना चाहिए --- या वैचारिक रूप से उनके साथ व्यवहार करना ... /./...


"चाहिए" -> "नहीं"।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.