কোনও ফাইলনামে কি স্থানের অনুমতি নেই?


31

বলা হয়ে থাকে যে ইউনিক্স এবং লিনাক্সে সাধারণভাবে আপনার কোনও ফাইলের ফাইলের নাম (সাধারণ ফাইল, ডির, লিংক, ডিভাইস ফাইল, ...) থাকা উচিত নয়।

তবে আমি তা সব সময় করি। ভিতরে একটি স্থান সহ একটি ফাইলের নামের জন্য,

  • নটিলাসে স্পেস চরিত্রটিকে একটি স্থান হিসাবে দেখানো হয়েছে।
  • বাশ টার্মিনালে আমি হয় \ কোনও স্থানকে উপস্থাপন করতে, অথবা ফাইলের নামটি জোড়া জোড়ের মধ্যে সংযুক্ত করে।
  • কিছু অ্যাপ্লিকেশনের ফাইলগুলিতে (নটিলাস, ওএসও এটি করবে কিনা তা নিশ্চিত নয়), ফাইলের নামটি প্রতিস্থাপন ব্যবস্থার সাথে লেখা হয় %20

কোনও ফাইল নামেই কি কোনও স্থানের অনুমতি দেওয়া যায় না?

আপনি কোনও ফাইলনামে কোনও স্থানটি কীভাবে সঠিকভাবে ব্যবহার বা ব্যবহার করবেন?


17
এটি অনুমোদিত তবে এটি সত্যই, সত্যই বিরক্তিকর। এটি জন্য কোন কারণ নেই। এটা করবেন না।
মনিকার সাথে লাইটনেস রেস

3
আপনি -rf ~(ব্যবহার touch -- "-rf ~") নামে একটি ফাইলও তৈরি করতে পারেন , তবে আমি এটির প্রস্তাব দেব না।
ইয়ান ডি স্কট 20 'এ

5
আপনি এটি করতে পারেন, এটি অনুমোদিত, যেমন "সিডি" নামে একটি স্ব-ধ্বংসাত্মক স্ক্রিপ্ট তৈরি করার মতো তবে এটি করা উচিত নয়। আপনার ফাইলটি ইতিমধ্যে 3 টি ভিন্ন সরঞ্জামে পৃথক দেখাচ্ছে, এতটা খারাপ না?
ফ্যালকো 4'14

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

2
@ স্নেলবোট স্পেসস আসল সমস্যার লক্ষণ যা মানকতার অভাব। ইউনিক্স ফাইল সিস্টেমে ফাইলগুলি "নাম" নিষিদ্ধ করে প্রায় বদ্ধ বাইনারি ব্লবগুলিতে অনুমতি দেয়। কেবল অবৈধ বাইটগুলি 0 এবং 47 ( /বিভাজক)। 254 টি বাকী সমস্ত বাইট ব্যবহার করা অবর্ণনীয় শীর্ষস্থানীয় "নাম" এর সমস্ত আচরণের দরজা উন্মুক্ত করে। স্পষ্টতই এটি উন্মাদ, তবে সকলেই "বুদ্ধিমান" কী তা নিয়ে একমত হয় না এবং বিভিন্ন চরিত্রগুলি বিভিন্ন সরঞ্জামকে ভেঙে দেয়। প্রত্যেকের বিমর্ষতার ছেদটি বেশ ছোট
jw013 1

উত্তর:


48

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

এর সাথে প্রতিস্থাপন করা স্থানগুলি %20প্রায়ই ফাইলের নামগুলিতে দেখা যায় না। এটি বেশিরভাগ (ওয়েব) ইউআরএল এর জন্য ব্যবহৃত হয়। যদিও এটি সত্য যে ইউআরএল থেকে% এনকোডিং প্রায়শই দুর্ঘটনাক্রমে ফাইলের নামগুলিতে প্রবেশ করে।


6
এটি "ইউআরএল এনকোডিং" বা "শতাংশ এনকোডিং" এন.উইকিপিডিয়া.org / উইকি / ইউআরএল_কোডিং অনুসারে সর্বাধিক উপযুক্ত নামটি সম্ভবত "ইউআরআই এনকোডিং", তবে লোকেরা ইউআরআইয়ের তুলনায় ইউআরএল বলতে সহজ বলে মনে করে , তাই এটি একটি সাধারণ রূপ আসল নয়। লক্ষ করুন যে ইউআরআই-তে সংরক্ষিত অক্ষরের সেট * নিক্স ফাইলের নামের চেয়ে বড় is
স্বর্ণলোকস

1
@ টিম আমি জানি না যে আপনি কোনও কমান্ড লাইন আর্গুমেন্টে একটি NUL অক্ষর নির্দিষ্ট করতে পারেনbash । আমি কয়েকটি জিনিস চেষ্টা করেছি যেমন এটি সিটিআরএল-ভি এর সাথে উদ্ধৃতি করা এবং এর মতো কিছু $(echo -e \\0)কিন্তু এটি কার্যকর হয়নি। জিনিসটি হ'ল, এনআরএল ফাইলের নামগুলিতে ব্যবহার করা যাবেনা তা হ'ল এটি সি স্ট্রিংগুলিতে ব্যবহার করা যাবে না (কারণ এটি স্ট্রিং টার্মিনেটর) এবং সমস্ত অন্তর্নিহিত এপিআই পাশাপাশি কার্যত সি প্রোগ্রামগুলির দ্বারা পরিচালিত সমস্ত স্ট্রিং সেই বিন্যাসটি ব্যবহার করে । যেহেতু bashসি-তে লিখিত হয়েছে, সেগুলির মধ্যে NUL এর সাথে কোনও স্ট্রিংয়ের পক্ষে এটির পক্ষে মোটেই সমর্থন নেই। আমি ভুল হতে পারি, কিছুটা অস্পষ্ট উপায় থাকতে পারে ...
সেলেদা

1
সাজানো প্রসঙ্গে উপর নির্ভর করে। স্ট্রিং ফাংশনগুলি সাধারণত চূড়ান্ত নাল গণনা করে না (বা বরং, প্রথম নালটি স্ট্রিংয়ের শেষে, এমনকি পরে স্টাফ থাকলেও), সুতরাং সেই অর্থে এটির দৈর্ঘ্য শূন্য এবং তাই খালি বিবেচিত হবে।
স্বর্ণলোকস 2'14

3
@ কেলাডা অবশ্যই আপনি ব্যবহার করতে পারেন NULএবং ব্যাশ করতে পারেন , আপনার প্রয়োজন $'\0'। উদাহরণস্বরূপ:find . -print0 | while read -d $'\0' f; do echo "$f"; done
টেরডন

1
@goldilocks লোকেরা কি আসলে URL টি 'url' হিসাবে উচ্চারণ করে, প্রায় 'আর্ল' দিয়ে ছড়াছড়ি করে?
মাইলস

17

শূন্যস্থানের হয় , ফাইলের নাম অনুমতিপ্রাপ্ত হিসাবে আপনি পালন করে আসছি।

আপনি যদি উইকিপিডিয়াতে এই চার্টটিতে "সর্বাধিক ইউনিক্স ফাইল সিস্টেমগুলি" এন্ট্রি দেখেন তবে আপনি লক্ষ্য করবেন:

  • যে কোনও 8-বিট অক্ষর সেট অনুমোদিত। আমরা এই ছাতার নীচেও 7-বিট ASCII গ্রহন করতে পারি, কারণ এটি বিভিন্ন 8-বিট সেটের উপসেট এবং সর্বদা 8 বিট বাইট ব্যবহার করে প্রয়োগ করা হয়।

  • শুধুমাত্র নিষিদ্ধ অক্ষর /এবং "নাল"। "নাল" শূন্য বাইট বোঝায় তবে এগুলি যাইহোক পাঠ্য ডেটাতে অনুমোদিত নয়।

তবে , আপনি যদি শেলটির কোনও ব্যবহার করেন, আপনি বুঝতে পারেন যে কিছু অক্ষর রয়েছে যা একটি ঝামেলা তৈরি করবে, সবচেয়ে উল্লেখযোগ্যভাবে *, এটি পসিক্স গ্লোব্বিং অপারেটর।

আপনি "ঝামেলা" কীভাবে সংজ্ঞায়িত করতে চান তার উপর নির্ভর করে আপনি সেখানে সাদা স্থান (স্পেস, ট্যাব, নিউলাইন ইত্যাদি) অন্তর্ভুক্ত করতে পারেন , কারণ এটি দিয়ে উদ্ধৃতি দেওয়ার প্রয়োজনীয়তা তৈরি করে ""। তবে এটি অনিবার্য, যেহেতু স্থানগুলি অনুমোদিত, তাই ...

আপনি কোনও ফাইলনামে কোনও স্থানটি কীভাবে সঠিকভাবে ব্যবহার বা ব্যবহার করবেন?

শেল / কমান্ড লাইনের প্রসঙ্গে, ফাইলের নামটি একক বা ডাবল উদ্ধৃতিতে মুড়ে রাখুন (তবে লক্ষ্য করুন যে সেগুলি একই ডাব্লুআরটি অন্যান্য সমস্যা নয়), বা ফাঁকা স্থানগুলি সহ \, যেমন:

> foo my\ file\ with\ spaces\ in\ the\ name

1
বাশে আপনি কীভাবে NUL চরিত্রটি নির্দিষ্ট করবেন? আমি এটি ফাইলের নামে পরীক্ষা করতে চাই।
টিম

1
আপনি পারবেন না। "এক্সামেটমেন্ট সিমেন্টিকস" বলতে বোঝায় যে সিতে (এবং অন্য যে সমস্ত ভাষা সম্পর্কে আমি অবগত রয়েছি), পাঠ্যের স্ট্রিংগুলি বাতিল হয়ে যায়। শেলটি সিতে প্রয়োগ করা হয়েছে The স্নেস্টেস্ট জিনিসটি যা আমি ভাবতে পারি তা হ'ল touch $(echo -e "foo\00bar")- অক্টাল মান হিসাবে -eপ্রক্রিয়াগুলি \0N, তবে এটি এখনও কোথাও হারিয়ে যায়, যা কেবল একটি ফাইল তৈরি করে foobar। অবশ্যই নুল মুদ্রণযোগ্য নয়, তবে আমি গ্যারান্টি দিচ্ছি যে এটি স্ট্রিং সীমাবদ্ধতার কারণে সেখান থেকে চলে গেছে।
স্বর্ণলোকস 2'14

"পাঠ্যের স্ট্রিংগুলি বাতিল হয়" -> আরও ব্যাখ্যা করতে: স্ট্রিংগুলি সর্বদা শেষে শূন্য বাইট দ্বারা সঞ্চিত থাকে, এ কারণেই পাঠ্যে এটি "অনুমোদিত নয়": আপনি যদি একটি সন্নিবেশ করেন তবে আপনি স্ট্রিংটি কার্যকরভাবে বন্ধ করে দিয়েছেন ated প্রান্তে. উদাহরণস্বরূপ, বেশিরভাগ উদ্দেশ্য এবং উদ্দেশ্য foo[NULL]barহিসাবে শেষ হবে foo। এর সাথে ঘটে না এমন ঘটনাটি echo -eদেখায় যে এনইউএলকে কোথাও ছাঁটাই করা হয়েছে।
স্বর্ণলোকস

5
প্রোগ্রামিং ভাষার একটি বিশাল অংশ স্ট্রিংগুলিতে নাল অক্ষরগুলিকে মঞ্জুরি দেয়। এটি কেবল ঘটে যায় যে মূল ভাষাটি সি হয় না, যা ইউনিক্স নির্মিত হয় - এবং বেশিরভাগ ইউনিক্স শেলগুলিও স্ট্রিংগুলিতে শূন্য অক্ষরকে মঞ্জুরি দেয় না। যাইহোক, @ টিম, সমস্ত ইউনিক্স ইন্টারফেস নাল-টার্মিনেটেড স্ট্রিংগুলি ব্যবহার করে, সুতরাং নাল বাইট এমন এক জিনিস যা আপনি কখনও কোনও ফাইলের নামে থাকতে পারেন না (প্লাস /যা ডিরেক্টরি বিভাজক এবং উদ্ধৃত করা যায় না, তাই পথের নামটিতে থাকতে পারে তবে কোনও ফাইলনেমে নয়)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
... তবে [আর কিছু মনে করবেন না]। যাইহোক, আমি খুব ঘন ঘন কিছু করব Not আমার মনে তাদের পাঠ্য ডেটা থাকার কোনও কারণ নেই। আমি এটি সংশোধন করতে হবে, কিন্তু এটি একটি মন্তব্য।
স্বর্ণলোকস

3

কারণটি বেশিরভাগ ক্ষেত্রে historicalতিহাসিক - ফাইলের নামগুলির মধ্যে ফাঁকের ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে কীওয়ার্ড / ফাইল নাম পৃথককারী হিসাবে ব্যবহৃত হত। ভবিষ্যতের শেল দোভাষীদের পুরানো স্ক্রিপ্টগুলির সাথে বিপরীত সামঞ্জস্যপূর্ণ হতে হয়েছিল, এবং এইভাবে আমরা আজ আমাদের মাথাব্যথার সাথে আটকে আছি।

প্রক্রিয়াগুলির বিকাশকারীদের যা খুব বেশি মানুষের সাথে মোকাবেলা করার প্রয়োজন হয় না তারা পুরোপুরি ফাঁক করে জিনিসগুলিকে অনেক বেশি, আরও সহজ করে তুলতে পারে। অ্যাপল এটি করে, / সিস্টেম / লাইব্রেরি / কোর সার্ভিসেসের বিষয়বস্তু / খুব কম জায়গা থাকে, স্পেস সহ প্রোগ্রামগুলি ব্যবহারকারীর পক্ষে এবং ওল্ডলুকস্ট্রেঞ্জআইফক্যামেলকেসেড খোলা হয়। অনুরূপ ইউনিক্স-পাথগুলিও ফাঁকা স্থান এড়ায়।

(কিছুটা সম্পর্কিত উপাখ্যান: 90-এর দশকের মাঝামাঝি সময়ে একটি উইন্ডোজ ড্রোন বলেছিল "ম্যাকের উপর আপনি এমন একটি কাজ করতে পারেন যা আমি উইন্ডোজে করতে পারি না" -> "ফাইলের নামে 12 টি অক্ষর ব্যবহার করুন।" -> নীরবতা। স্পেস ছিল সেই 12 টি অক্ষরেও সম্ভব)


1
আমি ভি 6 ইউনিক্স (সি। 1978) ব্যবহার করতাম। স্পেসগুলি তখন অনুমতি দেওয়া হয়েছিল । আমার একটি কাজ ছিল ফাইল সিস্টেমটি পার্স করার জন্য একটি প্রোগ্রাম লিখতে (সরাসরি ডিস্ক i / o ব্যবহার করে) এবং এর জন্য ফাঁকা স্থান এবং ব্যাকস্পেস রয়েছে এমন একটি ফাইল সন্ধান করা।
wallyk

তারা কি পুরোপুরি ফাঁকা স্থান ফেলেছে - বা ফাইলের নামগুলিতে খুব কম জায়গা রয়েছে?
মাইকজার্ভ

2

তাই হ্যাঁ, অন্য কোথাও যেমন বলা হয়েছে, কোনও ফাইলের নামেই প্রায় কোনও চরিত্র থাকতে পারে। কিন্তু এটা জানা যে একটি প্রয়োজন ফাইলের নাম হয় না একটি ফাইল। এটি কোনও ফাইলের বৈশিষ্ট্য হিসাবে কিছুটা ওজন বহন করে যে আপনার সাধারণত একটি ফাইল খোলার জন্য একটি ফাইলের নাম প্রয়োজন তবে কোনও ফাইলের নাম কেবল আসল ফাইলটির দিকেই নির্দেশ করে। এটা একটা লিঙ্ক, যে ডিরেক্টরি এটা রেকর্ড করেছেন, পাশাপাশি সঞ্চিত হয় inode সংখ্যা যা একটি করার জন্য একটি অনেক কাছাকাছি পড়তা হয় - প্রকৃত ফাইল

সুতরাং, আপনি জানেন, আপনি যা চান এটি কল করুন। কার্নেলটি যত্ন করে না - এটি হ্যান্ডেল করবে এমন সমস্ত ফাইলের রেফারেন্সগুলি যাইহোক সত্যিকারের ইনোড নম্বর নিয়ে কাজ করবে। ফাইলের নামটি মানুষের ব্যবহারের জন্য একটি জিনিস - আপনি যদি এটি একটি ক্রেজি জিনিস করতে চান তবে ভাল, এটি আপনার ফাইল সিস্টেম। এখানে, আমি কিছু ক্রেজি জিনিস করব:

প্রথমে আমি 20 টি ফাইল তৈরি করব, এবং স্থানগুলির ব্যতীত তাদের নাম রাখব, প্রতিটি ফাইলের নামের চেয়ে শেষের চেয়ে আরও একটি জায়গা থাকবে:

until [ $((i=$i+1)) -gt 20 ]
do  v=$v' ' && touch ./"$v"
done

এটা দারুণ মজার। আমার দেখুন ls:

ls -d ./*
./      ./          ./              ./                  ./                 
./      ./          ./              ./                  ./                  
./      ./          ./              ./                  ./                   
./      ./          ./              ./                  ./     

এখন আমি এই ডিরেক্টরিটি আয়না করতে যাচ্ছি:

set -- * ; mkdir ../mirror
ls -i1qdU -- "$@" |
sh -c 'while read inum na
    do  ln -T "$1" ../mirror/$inum
    shift ; done' -- "$@"
ls -d ../mirror/*

এখানে ../mirror/লিখিত সামগ্রী রয়েছে:

../mirror/423759  ../mirror/423764  ../mirror/423769  ../mirror/423774
../mirror/423760  ../mirror/423765  ../mirror/423770  ../mirror/423775
../mirror/423761  ../mirror/423766  ../mirror/423771  ../mirror/423776
../mirror/423762  ../mirror/423767  ../mirror/423772  ../mirror/423777
../mirror/423763  ../mirror/423768  ../mirror/423773  ../mirror/423778

ঠিক আছে, তবে আপনি জিজ্ঞাসা করছেন - তবে এটি কী ভাল? কোনটি আপনি কীভাবে বলতে পারেন? আপনি কীভাবে নিশ্চিত হন যে আপনি সঠিক ফাইলের নামের সাথে সঠিক ইনোড নম্বরটি সংযুক্ত করেছেন?

আচ্ছা ...

echo "heyhey" >>./'    ' 
tgt=$(ls -id ./'    ')
cat ../mirror/${tgt%% .*} \
    $(ls -1td ../mirror/* | head -n1) 

আউটপুট

heyhey
heyhey

দেখুন, উভয়ই ইনোড নম্বর ../mirror/"${tgt%% .*}"এবং ./' 'এতে একই ফাইলটি রেফারেন্স করে । তারা একই ফাইল বর্ণনা। তারা এর নাম দেয়, তবে আর কিছুই না nothing কোনও রহস্য নেই, সত্যিই, আপনি নিজের জন্য তৈরি করতে পারেন কিছু অসুবিধা, তবে শেষ পর্যন্ত আপনার ইউনিক্স ফাইল সিস্টেমের কাজকর্মের উপর কোনও প্রভাব ফেলবে না।

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