আমি জানি কমান্ডটি ব্যবহার করে ls
সমস্ত ডিরেক্টরি তালিকাভুক্ত করা হবে। তবে ls *
কমান্ড কী করে ? আমি এটি ব্যবহার করেছি এবং এটি কেবল ডিরেক্টরিগুলি তালিকাভুক্ত করে। সামনে তারকা ls
মানে কি গভীরভাবে ডিরেক্টরিগুলি তালিকাভুক্ত করতে পারে?
আমি জানি কমান্ডটি ব্যবহার করে ls
সমস্ত ডিরেক্টরি তালিকাভুক্ত করা হবে। তবে ls *
কমান্ড কী করে ? আমি এটি ব্যবহার করেছি এবং এটি কেবল ডিরেক্টরিগুলি তালিকাভুক্ত করে। সামনে তারকা ls
মানে কি গভীরভাবে ডিরেক্টরিগুলি তালিকাভুক্ত করতে পারে?
উত্তর:
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
এর **/.*
উদাহরণস্বরূপ লেখা থাকতে হবে .* **/.*
। সেখানে, একই হিসাবে অনুসরণ ***
হিসাবে বোঝা হয় ।**
*
**
tcsh
globstar
ভি 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
না )।sh
ksh
Always (*/)#
সর্বদা সমর্থিত থাকাকালীন এটি ..../
zsh-2.0 হিসাবে প্রথম স্বল্প হাতে ছিল (এবং সম্ভবত পূর্বে), তারপরে এটি ২.২ (1992 এর প্রথম দিকে) ****/
এর নির্দিষ্ট রূপটি পাওয়ার আগে 2.1 তে**/
find -name *
। বিশেষত আরও জটিল নিদর্শনগুলির সাথে, যদি বর্তমান ডিরেক্টরিতে ঠিক একটি মিল থাকে তবে লোকেরা প্রায়শই বুঝতে পারবেন না যে তারা তারাটি নিক্ষেপ করছে না find
।
*.[ab]
সমস্ত কিছুর সাথে মুছে ফেলার চেষ্টা করবে .[ab]
। [
মাছ বিশেষ নয়।
কমান্ডটি ls
ডিফল্ট ls .
: বর্তমান ডিরেক্টরিতে সমস্ত এন্ট্রি তালিকাবদ্ধ করুন ।
কমান্ডটির ls *
অর্থ ' *
শেল প্যাটার্নের প্রসারণে এলএস চালানো '
*
প্যাটার্ন শেল দ্বারা প্রক্রিয়াকৃত, এবং যারা একটি দিয়ে শুরু ব্যতীত, বর্তমান ডিরেক্টরির মধ্যে সমস্ত এন্ট্রি থেকে বিস্তৃতি হয় .
। এটি এক স্তর গভীরে যাবে।
ডাবল বা ট্রিপল *
নিদর্শনগুলির ব্যাবহার প্রকৃত শেলের উপর নির্ভর করে।
*
একটি ওয়াইল্ডকার্ড যা 0 বা ততোধিক অক্ষরের সাথে মেলে। কিছু আধুনিক শেল **
প্যাটার্নটি দেখে সাব ডিরেক্টরিতে পুনরাবৃত্তি হবে ।
*
কিছু যুক্ত না করে গ্লোবস্টারের ব্যাখ্যা সহ অন্যান্য উত্তর দেখুন। এছাড়া স্পষ্ট করা উচিত যে ম হয়েছে কিছুই আস্টেরিক্স সঙ্গে কাজ করতে, এটা এ সব এই আস্টেরিক্স কোন পাস আগে কখনো ছিল না। চালান echo ls *
দেখতে যখন আপনি লিখতে কি কার্যকর করা হবে ls *
।
কমান্ডটি কীভাবে প্রসারিত হবে তা দেখার জন্য আপনি প্রথমটির 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
ব্যবহারকারীদের প্রত্যেকের জন্য ডিরেক্টরি।
bash
নিজের শেল হিসাবে ব্যবহার করছেন " ← এবং গ্লোবস্টারটি সক্ষম নয় not shopt -s globstar
এবং এটি আবার চেষ্টা করুন ...
set -x
যা প্রতিবার সম্পাদিত "প্রকৃত" কমান্ড মুদ্রণ শুরু করবে (এর সাথে বন্ধ হবে set +x
)।
globstar
অপশনটি সক্ষম করা সহ ব্যাশ ৪.x সহ কয়েকটি শেলগুলিতে **
ম্যাচিং ডিরেক্টরিগুলি অবতরণ করে একটি পুনরাবৃত্ত গ্লোব সম্পাদন করবে। অতিরিক্ত তারকাচিহ্নগুলি এই ক্রিয়াকলাপটি আরও সংশোধন করে না।
ksh93
এবং zsh
, bash
পুনরাবৃত্তির যা সাধারণত অবাঞ্ছিত হয় ঢুকা symlinks আছে।
আপনি যদি "গভীর ডাইভ" করতে চান তবে ls -R (রিকার্সিভ) বিকল্পটি ব্যবহার করুন বা সন্ধান করুন, এর মতো ব্যবহার করুন:
find . -ls
"সন্ধান করুন" ডিরেক্টরি গাছের নীচে ডুব দেবে (যেমনটি 'এলএস -আর' হবে) এবং এর মধ্যে আরও অনেক বিকল্প রয়েছে যেমন ডিরেক্টরি তালিকা (-প্রকার d), কেবল ফাইল (-প্রকার চ) বা অন্য ফাইল যুক্ত ফাইল দেখানো বৈশিষ্ট্যগুলি (/ ইত্যাদি / পাসডাব্লুডে কোনও ব্যবহারকারী, নির্দিষ্ট অনুমতি এবং আরও অনেক কিছু নয়)। "সন্ধান করুন" স্ক্রিপ্টিংয়ে কিছুটা নিরাপদ (শাঁসের মধ্যে অসামঞ্জস্যপূর্ণ গ্লোববিং বিধিগুলির পাশাপাশি ত্রুটিযুক্ত ফাইলগুলির জন্য বিশেষ পলায়নের কারণে)।
শেল ওয়াইল্ডকার্ড গ্লোববিং ডটফাইলে কেবল একটি 'নক্ষত্র' দিয়ে কাজ করবে না। শুধুমাত্র ডটফাইলগুলি তালিকাবদ্ধ করতে, ব্যবহার করুন:
ls .??*
অতিরিক্ত * গভীরতার স্তর যুক্ত করে না। তবে আপনি যদি চেষ্টা করেন
ls */*/*
- আপনি বর্তমান ফোল্ডারে সাবোল্ডারগুলির সাবফোল্ডারগুলির তালিকা পাবেন ...
*
গুলি গভীরতার স্তর যুক্ত করবে।
bash
গ্লোবস্টার বিকল্পের সাথে জিএনইউ সহ কর্ন শেল এবং জেডএস। এবং সম্ভবত অন্যরাও, আমি অনুমান করব। unix.stackexchange.com/a/62665/14831
আমার মূল গ্রিপটি হ'ল প্রতিধ্বনি ** / *।
মে বা মে না: বর্তমান ডিরেক্টরিতে একটি অনুমান ফাইল তালিকাবদ্ধ করুন
মে বা মে না: অন্তর্ভুক্ত। *। এক্স ফাইল
সাধারণত আমি গ্লোব এক্সপ্রেশনটিকে '** /' হতে পছন্দ করব এবং যার ফলে নাল স্ট্রিং হতে পারে (উপ-ডিরেক্টরি নেই)। এইভাবে আমি প্রোগ্রাম ইনপুটটিতে গ্লোব এক্সপ্রেশনগুলি রূপান্তর করি। অবশ্যই আমি বীমা ব্যবহারের উদাহরণে এটি ব্যাখ্যা মতামত আছে।