লিনাক্স কীভাবে একাধিক পরপর পথ বিভাজক (/ হোম //// ব্যবহারকারীর নাম /// ফাইল) পরিচালনা করে?


111

আমি পাইথন স্ক্রিপ্টে কাজ করছি যা ফাইলের অবস্থানগুলি একটি স্ক্র্যাপ সাবপ্রসেসে পাস করে। সব ঠিক আছে, তবে আমি এমন পরিস্থিতিতে আছি যেখানে আমি কোনও ফাইলের নাম দিয়ে পথের সাথে যুক্ত হতে পারি যেমন /পথে দু'বার রয়েছে । আমি জানি যে আপনার একাধিক ফাইল বিভাজক থাকলে বাশ যত্ন নেয় না, তবে আমি কীভাবে ঠিক করব তা ভাবছি। এটি কি বাশ যা অতিরিক্ত স্ট্রিপগুলি ফেলে /দেয় বা সত্যই তা কখনই আসে না?

আমি জিজ্ঞাসা করছি কারণ এটি আমাকে /কনটেনেট করার সময় অতিরিক্ত এসগুলির জন্য বিভিন্ন কোডের লাইন সংরক্ষণ করবে । আমি জানি এটি কোনও বড় বিষয় নয়, তবে আমি আগ্রহীও। আমার কাছে একটি বাশ স্ক্রিপ্ট রয়েছে যার রেখাটি cd //usr(পরিবর্তে cd /usr) রয়েছে, যা বোঝা যাচ্ছে যে /কোনও পথে একাধিক গুলি ব্যবহারের তাত্পর্য থাকতে পারে


7
আমি কোডের অতিরিক্ত লাইনগুলিতে বিনিয়োগ করতাম ...
স্টেফান

5
যদি এ থাকা যেকেউ বজায় রাখে, যা আমি নিশ্চিত কেউ করে নি, আমি আসলে পাইথন ব্যবহার শেষ হয়নি joinএবং abspathএবং এই ধরনের কমান্ড।
ফালমারি

উত্তর:


165

একাধিক স্ল্যাশ অনুমোদিত এবং একক স্ল্যাশের সমতুল্য। থেকে একক ইউনিক্স স্পেসিফিকেশন (সংস্করণ 3) , বেস সংজ্ঞা §3.266 পথনাম : "। একাধিক ধারাবাহিক স্ল্যাশ এক স্ল্যাশ হিসাবে একই বলে মনে করা হয়"

একটি ব্যতিক্রম রয়েছে: যদি কোনও পথের নামটি ঠিক দুটি স্ল্যাশ দিয়ে শুরু হয়, তবে এটি আলাদাভাবে চিকিত্সা করা যেতে পারে (রেফার: বেস সংজ্ঞা §4.11 পথের নাম রেজোলিউশন )। লিনাক্স নিজেই এটি করে না, যদিও কিছু অ্যাপ্লিকেশন হতে পারে এবং অন্যান্য ইউনিক্স-ইশ সিস্টেম এটি করে (যেমন সাইগউইন)।

কোনও পাথের /নামের শেষে একটি চলন্ত পথের নামটি ডিরেক্টরিকে নির্দেশ করতে বাধ্য করে। (ইন POSIX 1003.1-2001 (সিঙ্গেল ইউনিক্স v3 এর) বেস সংজ্ঞা §4.11 পথনাম রেজল্যুশন , একটি trailing /একটি trailing সমতূল্য /.POSIX 1003.1-2008 (সিঙ্গেল ইউনিক্স V4) বেস সংজ্ঞা §4.12 প্রয়োজন সরিয়ে ফেলা হবে এটা সমতূল্য করতে /., যাতে অস্তিত্বহীন ডিরেক্টরিগুলির সাথে মোকাবিলা করার জন্য (উদাহরণস্বরূপ mkdir foo/, কাজ করা প্রয়োজন, যেখানে এটি mkdir foo/.হবে না - পরিবর্তনের যুক্তি দেখুন )।

ডিরেক্টরিতে প্রবেশের জন্য কাজ করা প্রোগ্রামগুলির জন্য, যদি কোনও ডিরেক্টরিতে fooএকটি প্রতীকী লিঙ্ক হয়, তবে পাসিং foo/হ'ল প্রোগ্রামটিকে প্রতীকী লিঙ্কের পরিবর্তে ডিরেক্টরিতে কাজ করার উপায়।

¹ দ্রষ্টব্য যে এটি কেবলমাত্র পথের নাম সমাধানের জন্য প্রযোজ্য, অর্থাত্ ফাইলগুলিতে অ্যাক্সেস করার সময়। ফাইলের ম্যানিপুলেশনগুলি ভিন্নভাবে কাজ করতে পারে। উদাহরণস্বরূপ basenameএবং dirnameপিছনে স্ল্যাশ উপেক্ষা করুন।


7
এর সমতুল্যটি /.পরে আলোচনা প্রক্রিয়াটি দ্বিধাগ্রস্ত ছিল বলে মুছে ফেলা হয়েছে। যাইহোক +1 এই ধরণের তথ্যগুলির সংক্ষিপ্তসার হিসাবে সন্ধান করা কঠিন is
hakre

17

ওএস কোনওভাবেই এটির যত্ন নেবে বলে মনে হয় না, একটি // পথের সাথে খোলার জন্য সরাসরি সিস্কল দিয়ে একটি সি প্রোগ্রাম চেষ্টা করে।

আপনি যদিও পাইথন লাইব্রেরি ফাংশনটি os.path.normpath এটি সাধারণ করতে ব্যবহার করতে পারেন, যা আপনাকে অতিরিক্তগুলির সন্ধানের স্ট্রিংয়ের মাধ্যমে স্ক্যান করে বাঁচায়। অন্যান্য ভাষারও একই রকম কার্যকারিতা রয়েছে।

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


5
নর্ম্প্যাথের উত্সে নিম্নলিখিত মন্তব্যে সাবধান থাকুন: কোনও পথকে সাধারণ করুন, উদাহরণস্বরূপ এ // বি, এ / / বি এবং এ / ফু / / বি সমস্তগুলি এ / বি হয়ে যায়। এটি বোঝা উচিত যে এটি প্রতীকী লিঙ্কগুলি অন্তর্ভুক্ত থাকলে পথটির অর্থ পরিবর্তন করতে পারে!
ব্লুহর্ন

8

সমস্ত ইউনিক্স সিস্টেমে যে আমি দেখেছি এটি একক হিসাবে একই /, তবে ইউনিক্স মান এটি নির্দিষ্ট করে

দুটি ক্রমান্বয়ে স্ল্যাশ দিয়ে শুরু হওয়া কোনও প্যাথনামটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে ব্যাখ্যা করা যেতে পারে, যদিও আরও দুটি নেতৃত্বের বেশি স্ল্যাশকে একক স্ল্যাশ হিসাবে বিবেচনা করা হবে।

সুতরাং এটি আপনার সিস্টেমের উপর নির্ভর করে বিশেষভাবে পরিচালনা করা যেতে পারে। (কিছু পুরানো ইউনিক্স সংস্করণ /রিমোট ফাইল সিস্টেম অ্যাক্সেসের জন্য একটি ডাবল নেতৃস্থানীয় ব্যবহার করেছে, এবং এখনও কিছু আছে যা করতে পারে))


7
Cygwin (যখন না একটি বাস্তব ইউনিক্স) অনুবাদ করে //remote/...সম্ভবত উইন্ডোজের সাথে 'দৃঢ়তা জন্য দূরবর্তী ফাইল সিস্টেম অ্যাক্সেস করতে, \\remote\...
প্রাক্তন

2
আমি বিশ্বাস করি (তবে এই মুহুর্তে কোনও ভাল রেফারেন্স গুগল করতে পারে না) উইন্ডোজ পসআইএক্স কমপ্যাট এপিআইগুলিও //remote/...ইউএনসি পাথ \\remote\...ফর্ম্যাটের মতোই আচরণ করবে ।
স্টিফেন পি

1
আমি মনে করি যে আমি বুস্ট.ফাইসিসটেমের বহনযোগ্য পাথের নামগুলি //একটি বিশেষ উপায়ে পরিচালনা করে, যাতে তারা falseনিখুঁত হওয়ার জন্য পরীক্ষা করতে পারে, ইউনিক্স / পসিক্স অনুমান অনুসারে।

7

os.path.joinপাইথনে ব্যবহার করুন এবং আপনি একাধিক স্ল্যাশ পাবেন না। কনক্রিটেটিং স্ট্রিং দ্বারা ফাইলের নামগুলি নিজেকে তৈরি করা দুর্বল পাইথন শৈলী হিসাবে বিবেচিত।


আমি সম্মত, কিন্তু ফাইলের নাম একটি কমান্ড স্ট্রিংয়ের অংশ, এবং ফাইলের নাম (শেষে) যুক্ত করার জন্য কমান্ড স্ট্রিংটিকে বিশ্লেষণের পরিবর্তে আমি কেবল এটি যুক্ত করতে চাই।
ফালমারি

1
@ ফালমারি: আপনি কেবল কোনও ফাইলের নাম কমান্ড স্ট্রিংয়ে যুক্ত করতে পারবেন না! একটি কমান্ড স্ট্রিং শেল দ্বারা পার্স করা হবে, সুতরাং ফাইল নামের বিশেষ অক্ষর উদ্ধৃত করা প্রয়োজন। সুতরাং আপনাকে ফাইলের নামটি তৈরি করতে হবে, তারপরে এটি কমান্ড স্ট্রিংয়ে রাখতে সঠিকভাবে উদ্ধৃতি দিন।
গিলস

এটি সত্যিই সুনির্দিষ্ট একটি প্রকল্প যা আমি নিজের থেকে নিজেকে ব্যবহার করে চলেছি। আমি সম্ভবত এই সম্পর্কে দৃ being় না ন্যায়সঙ্গত যথেষ্ট পরিষ্কার ছিল না। আমি এই ফাইলের পথের স্ট্রিংটি একটি শ্রেণীর কাছ থেকে পাচ্ছি যা আমাকে সঠিকভাবে পালিয়ে যাওয়া ফাইল পাথ দেয় এবং এই জাতীয়। এবং আমি এটিকে একটি কমান্ড লাইনের যুক্তিতে যুক্ত করছি
ফালমারি

1
@ ফালমারি: সুতরাং আপনার নিয়ন্ত্রণ না হওয়া কমান্ড-লাইন মানটি পরিষ্কার করতে নরম্পথ ব্যবহার করুন এবং তারপরে এগুলি সংযুক্ত করার জন্য জোড় ব্যবহার করুন।
নিল মেহেহে

এটি আসলে কি আমি = করছেন শেষ পর্যন্ত is \ আমি বিশেষ ক্ষেত্রে যেখানে আমি শুধু দেওয়া হয়েছিল হ্যান্ডেল করতে পারে না /খুব ভাল।
ফলমারি

3

এখানে কোন পার্থক্য নেই.

একাধিক স্ল্যাশ উপেক্ষা করা হবে (প্রভাব ছাড়াই), যেমন:

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

7
সেখানে পারেন যদি এটা ঠিক দুই এবং শুরুতে হতে; একটি ক্রমাগত দুটি স্ল্যাশ দিয়ে শুরু হওয়া কোনও প্যাথনামটি বাস্তবায়ন-সংজ্ঞায়িত পদ্ধতিতে ব্যাখ্যা করা যেতে পারে । অনুশীলনে আমি মনে করি এটি সঠিক এবং তারা কেবল উপেক্ষা করা হবে
মাইকেল মরোজেক

ধন্যবাদ ক্রিস, আমি স্পষ্টির প্রশংসা করি! (দুর্ভাগ্যক্রমে ওপিআইডি লগইন আমার পক্ষে কাজ করছে না বা আমি আপনাকে ভোট দিয়ে দেব)

@ রব আপনি নিবন্ধভুক্ত, তবে এখনও লগ ইন করেছেন (আপনি আপনার কুকি দ্বারা সন্ধান করেছেন)। আপনি এখন রেজিস্টার আপনার অ্যাকাউন্টে কোন OpenID সংযোগ স্থাপন করতে সক্ষম হওয়া উচিত, কিন্তু আপনি উভয় ক্ষেত্রেই ভোট করতে সক্ষম হওয়া উচিত
মাইকেল Mrozek

ধন্যবাদ মাইকেল কিন্তু "আপনাকে ভোট দিতে লগ ইন করতে হবে বা নিবন্ধন করতে হবে"। আপনি যখন কেবল একটি ইমেল ঠিকানা এবং নাম ব্যবহার করেন তখন আপনার সম্পূর্ণ অধিকার থাকে না। এবং যেহেতু ওপেনআইডিআইআর সময়সীমা নির্ধারণ করছে এবং আমি অন্য কোনও অ্যাকাউন্ট তৈরি করার মতো মনে করি না, তাই আমি ভাগ্যের বাইরে। অলস হওয়ার জন্য আমার দোষ আমি অনুমান করি, তবে আমি সহায়তার প্রশংসা করি।

0

অবশ্যই আপনি এটি পেরিয়ে কোনও একাধিক / (স্ল্যাশ) সম্ভাব্য পথকে সাধারণ করতে পারেন tr -s

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

... এবং তারপরে ব্যবহার করুন $NORMALIZED

তবে এটি প্রয়োজনীয় হওয়া উচিত। হিসাবে আমি জানি যে কোনও সঠিকভাবে ইউএনআইএক্স কার্নেলের সমবর্তী পথ বিভাজকগুলিকে উপেক্ষা করা উচিত --- বা ধারণা হিসাবে তাদের হিসাবে /./...


"উচিত" -> "হওয়া উচিত নয়"।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.