Ls *, ls ** এবং ls *** এর ফলাফল


86

আমি জানি কমান্ডটি ব্যবহার করে lsসমস্ত ডিরেক্টরি তালিকাভুক্ত করা হবে। তবে ls *কমান্ড কী করে ? আমি এটি ব্যবহার করেছি এবং এটি কেবল ডিরেক্টরিগুলি তালিকাভুক্ত করে। সামনে তারকা lsমানে কি গভীরভাবে ডিরেক্টরিগুলি তালিকাভুক্ত করতে পারে?

উত্তর:


155

lsডিরেক্টরিগুলির ফাইল এবং বিষয়বস্তু তালিকাভুক্ত করে এটি আর্গুমেন্ট হিসাবে পাস হচ্ছে এবং যদি কোনও যুক্তি না দেওয়া হয় তবে এটি বর্তমান ডিরেক্টরিটি তালিকাভুক্ত করে। এটি এর আচরণকে প্রভাবিত করে এমন অনেকগুলি বিকল্পও পাশ করা যেতে পারে ( man lsবিশদগুলির জন্য দেখুন)।

যদি lsকোনও আর্গুমেন্ট বলা হয়ে থাকে *, তবে এটি *বর্তমান ডিরেক্টরিতে ডাকা একটি ফাইল বা ডিরেক্টরি অনুসন্ধান করবে এবং অন্য যে কোনও একটির মতো এটি তালিকাবদ্ধ করবে। চরিত্রটি অন্য কোনওর চেয়ে অন্যভাবে lsআচরণ করে না *

তবে যদি ls *একটি হয় শেল কমান্ড লাইন, তারপর শেল যে প্রসারিত হবে *সংশ্লিষ্ট শেল এর অনুযায়ী globbing (এছাড়াও হিসাবে উল্লেখ করা ফাইলের নাম জেনারেশন বা ফাইলের নাম সম্প্রসারণ নিয়ম)।

যদিও বিভিন্ন শেল বিভিন্ন গ্লোববিং অপারেটরকে সমর্থন করে, তাদের মধ্যে বেশিরভাগ সহজতমতে একমত হন **প্যাটার্ন হিসাবে কোনও অক্ষরের সংখ্যা বোঝানো হয়, সুতরাং সেই *হিসাবে globবর্তমান প্যাকেজগুলির সাথে মেলে এমন ডিরেক্টরিগুলির ফাইলগুলির তালিকায় এটি প্রসারিত হবে। তবে একটি ব্যতিক্রম আছে যে কোনও .ফাইলের নামের মধ্যে একটি শীর্ষস্থানীয় ডট ( ) অক্ষরটি স্পষ্টভাবে মিলে যেতে হয়, সুতরাং *প্রকৃতপক্ষে ফাইল এবং ডিরেক্টরিগুলির তালিকাতে প্রসারিত হয় না .(অভিধান হিসাবে)।

উদাহরণস্বরূপ, যদি বর্তমান ডিরেক্টরির ফাইল নামক রয়েছে ., .., .foo, -lএবং foo bar, *শেল দুটি আর্গুমেন্ট প্রসারিত হবে পাস করতে ls: -lএবং foo bar, তাই এটি যেন আপনার দ্বারা টাইপ করা ছিল হবে:

ls -l "foo bar"

অথবা

'ls' "-l" foo\ bar

একই কমান্ডটি চালানোর জন্য তিনটি উপায়। সমস্ত 3 ক্ষেত্রে, lsকমান্ডটি (যা সম্ভবত /bin/lsউল্লিখিত ডিরেক্টরিগুলির অনুসন্ধান থেকে কার্যকর করা $PATHহবে) সেই 3 টি আর্গুমেন্টটি পাস করা হবে: "ls", "-l" এবং "foo বার"।

ঘটনাচক্রে, এই ক্ষেত্রে, lsপ্রথম (কঠোরভাবে দ্বিতীয় বলা ) একটিকে বিকল্প হিসাবে বিবেচনা করবে ।

এখন, যেমনটি আমি বলেছি, বিভিন্ন শেলের বিভিন্ন গ্লোববিং অপারেটর রয়েছে। কয়েক দশক আগে, অপারেটরটি zshচালু করল - **/যার অর্থ সাবডিরেক্টরিগুলির যে কোনও স্তরের সাথে মিলে যাওয়া, সংক্ষিপ্ত (*/)#এবং ***/যা ডিরেক্টরিগুলি অবতরণ করার সময় সিমলিঙ্কগুলি অনুসরণ করে তা ছাড়া এটি একই।

কয়েক বছর আগে (জুলাই 2003, ksh93o+) ksh93সেই আচরণটি অনুলিপি করার সিদ্ধান্ত নিয়েছিল তবে এটি optionচ্ছিক করে তোলার সিদ্ধান্ত নিয়েছে এবং কেবল কেসটি আবৃত করেছে **(নয় ***)। এছাড়াও, যখন **একা বিশেষ ছিল না zsh(কেবলমাত্র *অন্যান্য traditional **তিহ্যবাহী শেলগুলির **মতোই বোঝানো হয়েছে যেহেতু যে কোনও বর্ণের সংখ্যার সাথে অনুসরণ করা কোনও অক্ষর মানে), ksh93- তে একই হিসাবে বোঝানো হয়েছিল **/*(সুতরাং বর্তমানের নীচের কোনও ফাইল বা ডিরেক্টরি (লুকানো ফাইল বাদে)।

bashকপি ksh93কয়েক বছর পরে (ফেব্রুয়ারি 2009, ব্যাশ 4.0), একই বাক্য গঠন কিন্তু একটি দুর্ভাগা পার্থক্য সঙ্গে ব্যাশ এর **মত ছিল zshএর ***যখন একটি উপ-ডিরেক্টরির মধ্যে recursing এটা symlinks নিম্নলিখিত হচ্ছিল যে, যা সাধারণত নয় কি আপনি এটা করতে চান এবং বাজে পার্শ্ব প্রতিক্রিয়া হতে পারে। এটি আংশিকভাবে ব্যাশ -৩.৩ এ স্থির করা হয়েছিল যে সিমলিংকগুলি এখনও অনুসরণ করা হয়েছিল, তবে পুনরাবৃত্তি সেখানেই থেমে গেছে। এটি পুরোপুরি 5.0 এ স্থির হয়েছিল।

yash**২০০৮ সালে ২.০ সংস্করণে যুক্ত হয়েছে, extended-globবিকল্পটি সক্রিয় করা হয়েছে । এর বাস্তবায়ন একাকী খুব কাছাকাছি zshযে **বিশেষ নয়। সংস্করণ 2.15 (2009), এটি যোগ ***মত zshএবং তার নিজস্ব এক্সটেনশন দুই: .**এবং .***যখন (ইন recursing গোপন dirs অন্তর্ভুক্ত করা zsh, D উল্লিখিত glob কোয়ালিফায়ার হিসেবে ( **/*(D)) লুকানো ফাইল ও ডিরেক্টরিগুলি বিবেচনা করব, কিন্তু আপনি যদি শুধুমাত্র লুকানো তর্ক করতে চান dirs কিন্তু লুকানো ফাইল সম্প্রসারণ না হয়, আপনি প্রয়োজন ((*|.*)/)#*বা **/[^.]*(D))।

মাছ শেল এছাড়াও সমর্থন **। পূর্ববর্তী সংস্করণটির মতো bash, এটি ডিরেক্টরি ট্রিতে নামার সময় প্রতিলিঙ্কগুলি অনুসরণ করে। যে শেল **/*মধ্যে হিসাবে একই হয় না ****এটি আরও একটি এক্সটেনশন *যা বিভিন্ন ডিরেক্টরিকে বিস্তৃত করতে পারে। ইন fish, **/*.cম্যাচ হবে a/b/c.cকিন্তু a.cসময়, a**.cম্যাচ হবে a.cএবং ab/c/d.cএবং zshএর **/.*উদাহরণস্বরূপ লেখা থাকতে হবে .* **/.*। সেখানে, একই হিসাবে অনুসরণ ***হিসাবে বোঝা হয় ।*****

tcshglobstarভি 6.17.01 (মে 2010) এ একটি বিকল্প যুক্ত করেছে **এবং উভয় এবং ***à লা সমর্থন করে zsh

সুতরাং tcsh, bashএবং ksh93, (যখন সংশ্লিষ্ট অপশনটি নির্বাচন করা হল ( globstar)) বা fish, **বর্তমান এক নীচের সমস্ত ফাইল ও ডিরেক্টরিগুলি বিস্তৃতি, এবং ***হিসাবে একই **জন্য fish, একটি সিমবলিক লিঙ্ক ঢোঁড়ন **জন্য tcshসঙ্গে globstar, এবং একই *সালে bashএবং ksh93(এটা যদিও অসম্ভব নয় যে এই শেলগুলির ভবিষ্যতের সংস্করণগুলিও প্রতিলিঙ্কগুলি অতিক্রম করবে)।

উপরে, আপনি বিস্তারের কোনওটিকে বিকল্প হিসাবে ব্যাখ্যা করা হয়নি তা নিশ্চিত করার প্রয়োজনীয়তা লক্ষ্য করেছেন। তার জন্য, আপনি কি করবেন:

ls -- *

বা:

ls ./*

কিছু কমান্ড রয়েছে (এতে কিছু আসে যায় না ls) যেখানে --কিছু ফাইলনামের সাথে বিশেষভাবে বিবেচনা করা যেতে পারে সেহেতু দ্বিতীয়টি পছন্দযোগ্য। এটা ক্ষেত্রে -সবচেয়ে টেক্সট ইউটিলিটি জন্য, cdএবং pushdএবং ফাইলের নামের যেগুলিতে =চরিত্র awkউদাহরণস্বরূপ। Prepending ./সব আর্গুমেন্ট তাদের বিশেষ অর্থ সরিয়ে ফেলা হবে (ক্ষেত্রে অন্তত জন্য উপরে উল্লিখিত)।

এটিও লক্ষ করা উচিত যে বেশিরভাগ শেলের অনেকগুলি বিকল্প রয়েছে যা গ্লোব্বিং আচরণকে প্রভাবিত করে (যেমন ডট ফাইলগুলি অগ্রাহ্য করা হয় বা না, বাছাইয়ের ক্রম, কোনও মিল না থাকলে কী করা উচিত ...), এছাড়াও $FIGNOREপ্যারামিটারটি দেখুনksh

এছাড়াও, যে শেল কিন্তু csh, tcsh, fishএবং zsh, যদি globbing প্যাটার্ন যেকোনো ফাইল মিলছে না, প্যাটার্ন একটি unexpanded আমার যুক্তি, যা বিভ্রান্তির এবং সম্ভবত বাগ ঘটায় হিসাবে পাস করা হয়। উদাহরণস্বরূপ, যদি বর্তমান ডিরেক্টরিতে কোনও অ গোপন ফাইল থাকে

ls *

lsদুটি যুক্তি দিয়ে আসলে ফোন করবে lsএবং *। এবং এখানে কোনও ফাইল নেই বলেই, কোনওটিকেই বলা *হয় না, আপনি এলএস (শেল নয়) এর মতো একটি ত্রুটি বার্তা দেখতে পাবেন : ls: cannot access *: No such file or directoryযা মানুষকে ভাবতে বাধ্য করে যে এটি lsছিল আসলে গ্লোবগুলি প্রসারিত করে।

সমস্যাটি এরকম ক্ষেত্রে আরও মারাত্মক:

rm -- *.[ab]

তাহলে সেখানে কোন *.aনা *.bবর্তমান ডিরেক্টরির মধ্যে ফাইল, তারপর আপনি একটি ফাইল নামক মোছার শেষ পর্যন্ত হতে পারে *.[ab]ভুল করে ( csh, tcsh, এবং zshএকটি রিপোর্ট হবে কোনো মিল ত্রুটি এবং কল করবে না rm(এবং fishসমর্থন করে না [...]ওয়াইল্ডকার্ড))।

আপনি যদি একটি আক্ষরিক পাস করতে চাও তাহলে *করতে ls, আপনি যে উদ্ধৃত করা আছে *হিসাবে কিছু উপায় চরিত্র ls \*বা ls '*'বা ls "*"। পসিক্স-এর মতো শেলগুলিতে, গ্লোব্বিং সম্পূর্ণভাবে অক্ষম করা যায় set -o noglobবা set -f(পরবর্তীকালে / এমুলেশন না করে কাজ করে zshনা )।shksh


Always (*/)#সর্বদা সমর্থিত থাকাকালীন এটি ..../zsh-2.0 হিসাবে প্রথম স্বল্প হাতে ছিল (এবং সম্ভবত পূর্বে), তারপরে এটি ২.২ (1992 এর প্রথম দিকে) ****/এর নির্দিষ্ট রূপটি পাওয়ার আগে 2.1 তে**/


22
সত্যিই দুর্দান্ত উত্তর!
Andrea Corbellini

7
আর একটি চমৎকার উদাহরণ হ'ল find -name *। বিশেষত আরও জটিল নিদর্শনগুলির সাথে, যদি বর্তমান ডিরেক্টরিতে ঠিক একটি মিল থাকে তবে লোকেরা প্রায়শই বুঝতে পারবেন না যে তারা তারাটি নিক্ষেপ করছে না find
njsg

আমি +1 প্রদান চালিয়ে যাচ্ছি, স্টিফেন চ্যাজেলাসকে এখানে ইউনিক্স.স্ট্যাকেক্সেঞ্জা.কম এ সক্রিয় দেখে আমি সত্যিই আনন্দিত ! স্টিফেন, বরাবরের মতো দুর্দান্ত অবদান!
দিমিত্রে রাদৌলভ

1
মাছগুলিতে, *.[ab]সমস্ত কিছুর সাথে মুছে ফেলার চেষ্টা করবে .[ab][মাছ বিশেষ নয়।
কনরাড বোরোস্কি

35

কমান্ডটি lsডিফল্ট ls .: বর্তমান ডিরেক্টরিতে সমস্ত এন্ট্রি তালিকাবদ্ধ করুন

কমান্ডটির ls *অর্থ ' *শেল প্যাটার্নের প্রসারণে এলএস চালানো '

*প্যাটার্ন শেল দ্বারা প্রক্রিয়াকৃত, এবং যারা একটি দিয়ে শুরু ব্যতীত, বর্তমান ডিরেক্টরির মধ্যে সমস্ত এন্ট্রি থেকে বিস্তৃতি হয় .। এটি এক স্তর গভীরে যাবে।

ডাবল বা ট্রিপল *নিদর্শনগুলির ব্যাবহার প্রকৃত শেলের উপর নির্ভর করে।

*একটি ওয়াইল্ডকার্ড যা 0 বা ততোধিক অক্ষরের সাথে মেলে। কিছু আধুনিক শেল **প্যাটার্নটি দেখে সাব ডিরেক্টরিতে পুনরাবৃত্তি হবে ।


17
অতিরিক্ত * কিছু যুক্ত না করে গ্লোবস্টারের ব্যাখ্যা সহ অন্যান্য উত্তর দেখুন। এছাড়া স্পষ্ট করা উচিত যে ম হয়েছে কিছুই আস্টেরিক্স সঙ্গে কাজ করতে, এটা এ সব এই আস্টেরিক্স কোন পাস আগে কখনো ছিল না। চালান echo ls *দেখতে যখন আপনি লিখতে কি কার্যকর করা হবে ls *
njsg

12

কমান্ডটি কীভাবে প্রসারিত হবে তা দেখার জন্য আপনি প্রথমটির echoপরিবর্তে টাইপ করে পুরো প্রক্রিয়াটিকে ক্ষুন্ন করতে পারেন ls:

$ echo *
Applications Downloads Documents tmp.html

সুতরাং এই ক্ষেত্রে, ls *প্রসারিতls Applications Downloads Documents tmp.html

$ echo **
Applications Downloads Documents tmp.html

$ echo ***
Applications Downloads Documents tmp.html

সুতরাং কোন পরিবর্তন। এটি ধরে নিয়েছে যে আপনি bashনিজের শেল হিসাবে ব্যবহার করছেন - বেশিরভাগ লোকেরা এবং বিভিন্ন শেলের আলাদা আচরণ থাকে। আপনি ব্যবহার করেন, তাহলে ashবা cshবা kshবা zsh, আপনি কিছু ভিন্নভাবে কাজ আশা করতে পারেন। এটি বিভিন্ন শাঁস থাকার বিষয়।

সুতরাং আসুন কিছু আলাদা চেষ্টা করুন (এখনও সহ bash) যাতে আমরা গ্লোব্বিং ( *) অপারেটরটি আমাদের জন্য কী করতে পারে তার একটি ধারণা পাই । উদাহরণস্বরূপ, আমরা নামের অংশে ফিল্টার করতে পারি:

$ echo D*
Downloads Documents

এবং মজার বিষয় হল, একটি পিছনে স্ল্যাশ কোনও ডিরেক্টরি নামের একটি অন্তর্নিহিত অংশ। সুতরাং */কেবল ডিরেক্টরিগুলি (এবং ডিরেক্টরিগুলিতে প্রতীকী লিঙ্কগুলি) পাওয়া যাবে:

$ echo */
Applications/ Downloads/ Documents/

এবং আমরা মাঝখানে স্ল্যাশ রেখে একাধিক স্তরে কিছু ফিল্টারিং করতে পারি:

$ echo D*/*/
Documents/Work/ /Documents/unfinished/

যেহেতু Downloadsডিরেক্টরিতে কোনও উপ-ডিরেক্টরি থাকে না তাই এটি আউটপুটে শেষ হয় না। আপনার পছন্দসই ফাইলগুলি পরীক্ষা করার জন্য এটি খুব দরকারী। আমি সর্বদা এই জাতীয় আদেশ ব্যবহার করি:

$ ls -l /home/*/public_html/wp-config.php

এই তালিকাগুলি, যদি কোনও থাকে তবে wp-config.phpযে কোনও ব্যবহারকারীর public_htmlডিরেক্টরিটির বেস স্তরে উপস্থিত সমস্ত ফাইল । বা সম্ভবত আরও সম্পূর্ণ হতে পারে:

$ find /home/*/public_html/ -name wp-config.php

এই যে কোনো পাবেন wp-config.phpযেকোনও ব্যবহারকারীর ফাইল public_htmlডিরেক্টরি বা তাদের সাবডিরেক্টরি কোন, কিন্তু এটা শুধু চেয়ে আরো দক্ষতার সঙ্গে কাজ করবে find /home/ -name wp-config.php, কারণ এটি কিছু পরীক্ষা করা হবে না কিন্তুpublic_html ব্যবহারকারীদের প্রত্যেকের জন্য ডিরেক্টরি।


1
"এটি ধরে নেয় আপনি bashনিজের শেল হিসাবে ব্যবহার করছেন " ← এবং গ্লোবস্টারটি সক্ষম নয় not shopt -s globstarএবং এটি আবার চেষ্টা করুন ...
njsg

ডেমিস্টাইফ করার আরেকটি উপায় হ'ল set -xযা প্রতিবার সম্পাদিত "প্রকৃত" কমান্ড মুদ্রণ শুরু করবে (এর সাথে বন্ধ হবে set +x)।
শ্রীভাতসারআর

10

globstarঅপশনটি সক্ষম করা সহ ব্যাশ ৪.x সহ কয়েকটি শেলগুলিতে **ম্যাচিং ডিরেক্টরিগুলি অবতরণ করে একটি পুনরাবৃত্ত গ্লোব সম্পাদন করবে। অতিরিক্ত তারকাচিহ্নগুলি এই ক্রিয়াকলাপটি আরও সংশোধন করে না।


1
আমি আমার উত্তর বলেন যদিও, যে বিপরীত হুঁশিয়ার ksh93এবং zsh, bashপুনরাবৃত্তির যা সাধারণত অবাঞ্ছিত হয় ঢুকা symlinks আছে।
স্টাফেন চেজেলাস

এটি এখন বাশ ৪.৩-এ স্থির করা হয়েছে
স্টাফেন চেজেলাস

1

আপনি যদি "গভীর ডাইভ" করতে চান তবে ls -R (রিকার্সিভ) বিকল্পটি ব্যবহার করুন বা সন্ধান করুন, এর মতো ব্যবহার করুন:

find . -ls

"সন্ধান করুন" ডিরেক্টরি গাছের নীচে ডুব দেবে (যেমনটি 'এলএস -আর' হবে) এবং এর মধ্যে আরও অনেক বিকল্প রয়েছে যেমন ডিরেক্টরি তালিকা (-প্রকার d), কেবল ফাইল (-প্রকার চ) বা অন্য ফাইল যুক্ত ফাইল দেখানো বৈশিষ্ট্যগুলি (/ ইত্যাদি / পাসডাব্লুডে কোনও ব্যবহারকারী, নির্দিষ্ট অনুমতি এবং আরও অনেক কিছু নয়)। "সন্ধান করুন" স্ক্রিপ্টিংয়ে কিছুটা নিরাপদ (শাঁসের মধ্যে অসামঞ্জস্যপূর্ণ গ্লোববিং বিধিগুলির পাশাপাশি ত্রুটিযুক্ত ফাইলগুলির জন্য বিশেষ পলায়নের কারণে)।

শেল ওয়াইল্ডকার্ড গ্লোববিং ডটফাইলে কেবল একটি 'নক্ষত্র' দিয়ে কাজ করবে না। শুধুমাত্র ডটফাইলগুলি তালিকাবদ্ধ করতে, ব্যবহার করুন:

ls .??*


-1

অতিরিক্ত * গভীরতার স্তর যুক্ত করে না। তবে আপনি যদি চেষ্টা করেন

 ls */*/*

- আপনি বর্তমান ফোল্ডারে সাবোল্ডারগুলির সাবফোল্ডারগুলির তালিকা পাবেন ...


ভুল। শেলের উপর নির্ভর করে অতিরিক্ত *গুলি গভীরতার স্তর যুক্ত করবে।
njsg

তাহলে কী শেল অতিরিক্ত তারার গভীরতার স্তর যুক্ত করবে?
ভিবি 9-ইউএনআনিক

বেশ কিছু। bashগ্লোবস্টার বিকল্পের সাথে জিএনইউ সহ কর্ন শেল এবং জেডএস। এবং সম্ভবত অন্যরাও, আমি অনুমান করব। unix.stackexchange.com/a/62665/14831
njsg

-1

আমার মূল গ্রিপটি হ'ল প্রতিধ্বনি ** / *।

মে বা মে না: বর্তমান ডিরেক্টরিতে একটি অনুমান ফাইল তালিকাবদ্ধ করুন

মে বা মে না: অন্তর্ভুক্ত। *। এক্স ফাইল

সাধারণত আমি গ্লোব এক্সপ্রেশনটিকে '** /' হতে পছন্দ করব এবং যার ফলে নাল স্ট্রিং হতে পারে (উপ-ডিরেক্টরি নেই)। এইভাবে আমি প্রোগ্রাম ইনপুটটিতে গ্লোব এক্সপ্রেশনগুলি রূপান্তর করি। অবশ্যই আমি বীমা ব্যবহারের উদাহরণে এটি ব্যাখ্যা মতামত আছে।

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