मुझे पता है कि यह ऐसा कुछ नहीं है जिसे कभी किया जाना चाहिए, लेकिन क्या स्लैश वर्ण का उपयोग करने का कोई तरीका है जो आमतौर पर लिनक्स में फ़ाइल नाम के भीतर निर्देशिका को अलग करता है?क्या फ़ाइल नाम में "/" उपयोग करना संभव है?
उत्तर
जवाब है कि आप तब तक नहीं कर सकते जब तक कि आपके फाइल सिस्टम में कोई बग न हो।
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
जब सिस्टम कॉल लागू हो जाता है, यह नाम पर एक पथ देखने (do_path_lookup
) करता है:
अपनी फ़ाइल fs/namei.c
renameat
कहा जाता है में परिभाषित का नाम बदलने के लिए एक प्रणाली कॉल नहीं है: यहाँ क्यों है। इस अनुरेखण रखें, और हम link_path_walk
जो इस है करने के लिए मिल:
static int link_path_walk(const char *name, struct nameidata *nd)
{
struct path next;
int err;
unsigned int lookup_flags = nd->flags;
while (*name=='/')
name++;
if (!*name)
return 0;
...
इस कोड को किसी भी फाइल सिस्टम के लिए लागू होता है। इसका मतलब क्या है? इसका अर्थ यह है कि यदि आप परंपरागत माध्यमों का उपयोग कर फ़ाइल के नाम के रूप में वास्तविक '/'
वर्ण के साथ पैरामीटर पास करने का प्रयास करते हैं, तो यह वही नहीं करेगा जो आप चाहते हैं। चरित्र से बचने का कोई रास्ता नहीं है।
- यूनिकोड वर्ण या कुछ है कि एक स्लेश तरह दिखता है, लेकिन नहीं है का उपयोग करें: एक फाइल सिस्टम इस "का समर्थन करता है" तो यह इसलिए क्योंकि वे या तो है।
- उनके पास एक बग है।
इसके अलावा, अगर आप में जाने के लिए और एक फ़ाइल नाम में एक स्लेश चरित्र जोड़ने के लिए बाइट्स संपादित किया था, बुरी चीजें क्या होगा। इसका कारण यह है कि आप कभी भी इस फ़ाइल को नाम से नहीं देख सकते :(जब भी आपने किया था, लिनक्स मान लेगा कि आप एक गैर-निर्देशिका निर्देशिका का जिक्र कर रहे थे। 'आरएम *' तकनीक का उपयोग करना या तो काम नहीं करेगा, क्योंकि बैश बस फाइलनाम में फैलता है।यहां तक कि rm -rf
काम नहीं होता है, के बाद से एक सरल strace कैसे चीजें हुड के नीचे पर जाने का पता चलता है (छोटा):
$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0) = 0
unlinkat(3, "out", 0) = 0
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(3) = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...
सूचना है कि unlinkat
को इन कॉल विफल हो जाएगा क्योंकि वे नाम से फाइलों का उल्लेख करने की जरूरत है।
इसके अलावा, ध्यान दें कि कम से कम 'e2fsck' किसी भी फ़ाइल नाम को एक अवैध फ़ाइल नाम के रूप में मानता है जिसे ['स्रोत देखें] (http://git.kernel.org/?p=fs/ ext2/e2fsprogs.git, एक = ब्लॉब; च = e2fsck/pass2.C# L455)। इसलिए यदि आप किसी फ़ाइल नाम के साथ समाप्त हो जाते हैं जो उसमें स्लेश हो गया है, तो आप समस्या को ठीक करने के लिए 'fsck' का उपयोग कर सकते हैं। – ehabkost
आप एक यूनिकोड वर्ण का उपयोग कर सकते हैं जो "/" (उदाहरण के लिए this seemingly redundant glyph) के रूप में प्रदर्शित करता है) मानते हैं कि आपका फाइल सिस्टम इसका समर्थन करता है।
हां, ठीक है: केवल /, जो यू + 002 एफ 'सॉलिडस' है, प्रतिबंधित है। अन्य उपयुक्त उम्मीदवार हैं:/यू +2044 'फ्रक्शन स्लैश' है;/यू +2215 'डिवीजन स्लैश' है; ⧸ यू + 2 9 एफ 8 'बिग सोलिडस' है;/यू + एफएफ 0 एफ 'फुलविड्थ सोलिडस' है, और ╱ यू +2571 है 'बॉक्स ड्रॉइंग लाइट डायगोनल अप्पर राइट लेफ्ट बाएं'। सभी सराहनीय काम करेंगे! – tchrist
लेकिन फिर यदि उपयोगकर्ता उन वास्तविक पात्रों को उनकी फ़ाइल/डीआईआर नामों में उपयोग करता है तो क्या होगा? हमें एक सामान्य बचने के समाधान की आवश्यकता है। बहुत खराब लिनक्स का सामान्य कोड किसी का समर्थन नहीं करता है, क्योंकि यह सचमुच ASCII 0x2F पर मेल खाता है। ASCII कम से कम 20 वर्षों से एक बड़ा नो-नो है। (यूनिकोड 1.0 1 99 1 से है!) – Evi1M4chine
संक्षिप्त उत्तर है: नहीं, आप नहीं कर सकते। निर्देशिका संरचना को परिभाषित करने के कारण यह एक आवश्यक निषेध है।
और जैसा कि बताया गया है, आप एक यूनिकोड चरित्र प्रदर्शित कर सकते हैं जो "स्लैश जैसा दिखता है", लेकिन जहां तक आप प्राप्त करते हैं।
केवल एक सहमत-पर एन्कोडिंग के साथ। उदाहरण के लिए, आप सहमत हो सकते हैं कि %
को %%
के रूप में एन्कोड किया जाएगा और %2F
का अर्थ /
होगा। इस फ़ाइल तक पहुंचने वाले सभी सॉफ़्टवेयर को एन्कोडिंग को समझना होगा।
"जिसे हम किसी भी अन्य नाम से स्लैश कहते हैं, वह गंध के रूप में गंध करेगा" - शेक्सपियर –
यह इस बात पर निर्भर करता है कि आप किस फाइल सिस्टम का उपयोग कर रहे हैं।
यह केवल फाइल सिस्टम पर निर्भर नहीं है, सभी * निक्स सिस्टम में सिस्टम कॉल पार्स करेगा/निर्देशिका पेड़ के एक घटक के रूप में। –
फॉरवर्ड स्लैश कैरेक्टर कर्नेल में हार्ड-कोड किया गया है, फाइल सिस्टम से स्वतंत्र है (अपने कर्नेल स्रोत में 'grep -r' '/' "* * * करने का प्रयास करें) –
@RobertMartin" फॉरवर्ड "स्लैश ??? – tchrist
सामान्य रूप से फ़ाइल नाम में "खराब" वर्णों का उपयोग करने का प्रयास करना एक बुरा विचार है; भले ही आप इसे किसी भी तरह प्रबंधित करते हैं, फिर भी यह फ़ाइल को बाद में उपयोग करना मुश्किल बनाता है। फाइल सिस्टम विभाजक फ्लैट-आउट बिल्कुल काम नहीं करेगा, इसलिए आपको वैकल्पिक विधि चुनने की आवश्यकता होगी।
क्या आपने यूआरएल-एन्कोडिंग यूआरएल को तब फ़ाइल नाम के रूप में उपयोग करने पर विचार किया है? परिणाम फ़ाइल नाम के रूप में ठीक होना चाहिए, और एन्कोडेड संस्करण से नाम को पुनर्निर्माण करना आसान है।
एक और विकल्प इंडेक्स बनाना है - आप जिस भी विधि को पसंद करते हैं, आउटपुट फ़ाइल नाम बनाएं - अनुक्रमिक रूप से क्रमांकित नाम, SHA1 हैश, जो कुछ भी - जेनरेट की गई फ़ाइल नाम/यूआरएल जोड़ी के साथ एक फाइल लिखें। आप इसे हैश में सहेज सकते हैं और इसे यूआरएल-टू-फाइलनाम लुकअप करने के लिए या हैश के उलट संस्करण के साथ इसके विपरीत उपयोग कर सकते हैं, और यदि आप आवश्यक हो तो इसे लिख सकते हैं और बाद में इसे फिर से लोड कर सकते हैं।
- 1. क्या PHP में array_shift() का उपयोग करना संभव है और कुंजी प्राप्त करना संभव है?
- 2. क्या बाहरी फ़ाइल में स्प्रिंग फ्रेमवर्क के लिए क्लास नाम निर्दिष्ट करना संभव है?
- 3. क्या किसी फ़ाइल में लाइनों को संशोधित करना संभव है?
- 4. क्या बैश में $ array =() का उपयोग करना संभव है?
- 5. क्या एक आईफोन ऐप नाम "रजिस्टर" करना संभव है?
- 6. क्या AVURLAsset फ़ाइल एक्सटेंशन के बिना काम करना संभव है?
- 7. क्या 'xlsread' का उपयोग करके Excel शीट्स का नाम MATLAB में लोड करना संभव है?
- 8. क्या हाइबरनेट में विश्लेषणात्मक कार्यों का उपयोग करना संभव है?
- 9. क्या हिपहॉप में पीईसीएल एक्सटेंशन का उपयोग करना संभव है?
- 10. क्या एम्बेडेड मोड में ओकैमल का उपयोग करना संभव है?
- 11. क्या वाणिज्यिक वेबसाइट में सीकेएडिटर का उपयोग करना संभव है?
- 12. क्या एआईडीएल इंटरफेस में विरासत का उपयोग करना संभव है?
- 13. क्या प्रक्रियाओं में फ़ंक्शन पॉइंटर्स का उपयोग करना संभव है?
- 14. क्या ईमेल में ग्रेडिएंट का उपयोग करना संभव है?
- 15. क्या HTMLunit में HTTPS प्रॉक्सी का उपयोग करना संभव है?
- 16. क्या backbone.js में वैश्विक चर का उपयोग करना संभव है?
- 17. क्या ऑक्टेव में पायथन मॉड्यूल का उपयोग करना संभव है?
- 18. क्या javanit परीक्षणों में java.lang.instrument.Instrumentation का उपयोग करना संभव है?
- 19. क्या webservice में कैश का उपयोग करना संभव है?
- 20. क्या संकलित पायथन फ़ाइल आयात करना संभव है?
- 21. क्या ब्राउज़र में ट्रैसरआउट करना संभव है?
- 22. क्या .wxl फ़ाइल का उपयोग कर वाईएक्स में ईयूएलए को स्थानांतरित करना संभव है?
- 23. क्या सिम कार्ड क्रिप्टोग्राफिक फ़ंक्शंस का उपयोग करना संभव है?
- 24. क्या फ़ाइल पथ और फ़ाइल नाम में
- 25. क्या फायरबर्ड में एक टेबल का नाम बदलना संभव है?
- 26. 'संक्षिप्त नाम' संभव है?
- 27. चींटी का उपयोग करना, क्या टैग IF में AND, या स्थिति का उपयोग करना संभव है?
- 28. रेल में styleheet.css.erb का उपयोग करना संभव है?
- 29. क्या घोषणा का उपयोग करते हुए विरोधाभासी प्रकार के नाम को असंबद्ध करना संभव है?
- 30. फ़ाइल नाम या फ़ाइल नाम?
क्या फाइल सिस्टम? – Nicolas
मुझे लगता है कि आप अपने हार्डकिस्क विभाजन और पैच को सीधे '/' चरित्र में सीधे पहुंच का उपयोग करके फ़ाइल के नाम को संशोधित कर सकते हैं। क्या होता है एक दिलचस्प सवाल है ... शायद आप जो चाहते हैं उसे नहीं। – hochl
लेकिन संक्षिप्त उत्तर होना चाहिए: नहीं, यह ऐसा कुछ नहीं है जो कभी किया जाना चाहिए :-) –