*
শেল দ্বারা প্রসারিত একটি গ্লোব হয়। ডিফল্ট শেলগুলি এমন ফাইলগুলিকে অন্তর্ভুক্ত করে না যার নাম শুরু হয় .
(যাকে বলা হয় লুকানো ফাইল বা ডটফিলস) যদি না নেতৃস্থানীয় .
আক্ষরিক প্রবেশ না করে ।
*
বা [.]*
বা ?*
বা *.*
বা dir/*
dotfiles অন্তর্ভুক্ত করবে না।
.*
বা dir/.*
হবে।
সুতরাং আপনি করতে পারেন:
mv -- * .* /dest/
তবে কিছু শাঁস সহ bash
(তবে তা নয় zsh
, mksh
না fish
) এই অপব্যবহার রয়েছে যে প্রসারিত প্রসারণটি এবং বিশেষ ডিরেক্টরি এন্ট্রিগুলি .*
অন্তর্ভুক্ত রয়েছে , যা আপনি এখানে চান না (এবং সাধারণত কোনও গ্লোবও অন্তর্ভুক্ত করতে চান না যার কারণে আমি এটিকে অপব্যবহার বলি)।.
..
সেই কারণে আপনি দেখতে পাবেন যে কখনও কখনও লোকেরা ব্যবহার করে (বোর্নের মতো শেলগুলিতে):
mv -- * .[!.]* ..?* /dest/
এটি তিনটি গ্লোব, প্রথমটি নন-লুকানো ফাইলগুলির সাথে মিলিত, দ্বিতীয় একটি ফাইলের নাম এবং তার পরে .
অন্য একটি অক্ষর .
এবং তৃতীয় একটি ফাইলের নাম ..
অন্তত একটি অক্ষর দ্বারা শুরু হওয়া ।
তবে কিছু আধুনিক শেলগুলির কাছাকাছি আরও ভাল উপায় রয়েছে
zsh
এর সাহায্যে zsh
আপনি (D)
গ্লোব কোয়ালিফায়ার ব্যবহার করে গ্লোবটিতে ডটফাইলগুলি অন্তর্ভুক্ত করা উচিত তা নির্দিষ্ট করতে পারেন :
mv -- *(D) /dest/
zsh
এছাড়াও বোর্ন শেলের অন্য ভুল বৈশিষ্ট্য এটি ঠিক করেছে যে প্যাটার্নটি মেলে না, mv
কমান্ডটি চালানো হয় না।
যেমন উপরে বলা হয়েছে এটি কখনও অন্তর্ভুক্ত করবে না .
বা ..
তার গ্লোবগুলিতেও তাই হবে না
mv -- * .* /dest/
নিরাপদ হবে। তবে, যদি কোনও ফাইলের মিল নেই *
বা .*
কমান্ডের সাথে মেলে কোনও ফাইল বাতিল করা হবে, সুতরাং এটি ব্যবহার করা ভাল:
mv -- (*|.*) /dest/
অন্য কয়েকটি শেলের মতো আপনিও সমস্ত গ্লোবগুলিকে ডটফাইলগুলি অন্তর্ভুক্ত করতে বাধ্য করতে পারেন (উদাহরণস্বরূপ যদি আপনি নিজেকে ডটফাইলগুলি প্রায়শই অন্তর্ভুক্ত করতে চান তবে) এর সাথে:
setopt dotglob
বা:
set -o dotglob
এর পরে, আপনি যদি কোনও নির্দিষ্ট গ্লোব ডটফিলগুলি অন্তর্ভুক্ত না করতে চান তবে আপনি এটি লিখতে পারেন:
echo *(^D)
বা:
echo [^.]*
সজোরে আঘাত
দুর্ভাগ্যক্রমে bash
গ্লোব কোয়ালিফায়ার নেই। সুতরাং আপনি বিশ্বব্যাপী ডটফিল অন্তর্ভুক্তি সক্ষম করে রেখেছেন। ইন bash
, বাক্য গঠনটি হ'ল:
shopt -s dotglob
(এবং [^.]*
লুকানো ফাইল ছাড়াই গ্লোবগুলির জন্য ব্যবহার করুন )।
সঙ্গে dotglob
, bash
অন্তর্ভুক্ত না .
কিংবা ..
মত globs মধ্যে *
, কিন্তু এখনও মত globs জন্য করে .*
।
আপনি সেট করেন তাহলে GLOBIGNORE
কিছু খালি নয় এমন পরিবর্তনশীল, এটা তখন স্বয়ংক্রিয়ভাবে সক্ষম dotglob
বিকল্প এবং বাদ .
এবং ..
থেকে .*
globs কিন্তু থেকে dir/.*
বা .*/file
বেশী (!) যাতে রক্ষাকবচ চমত্কার অনর্থক। আপনি কাজ করতে পারে GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'
কিন্তু তারপর এটা পছন্দ globs বিরতি দেবে */.
বা ./*
অথবা ../*
।
একটি ভাল কাজ প্রায় ব্যবহার করা [.]*
বা dir/[.]*
বা [.]*/file
(সঙ্গে dotglob
সক্ষম করা থাকে) ব্যতীত dotfiles প্রসারিত করতে .
এবং ..
।
মাছ
fish
গ্লোবগুলিও অন্তর্ভুক্ত .
নয় ..
। সংস্করণের উপর নির্ভর করে কোনও মিল নেই, তখন এটি zsh
(বা bash -o failglob
) বা এর মতো কাজ করবে bash -o nullglob
।
mv -- * .* /dest/
যদি লুকানো এবং গোপন না থাকা উভয় ফাইলই কাজ করে। অন্যথায়, ওয়াইএমএমভি এবং কিছু সংস্করণ সহ, mv -- /dest
কোনও ফাইল না থাকলে এটি কল করতে পারে ।
ksh93
ksh93
উভয়ই গ্লোব কোয়ালিফায়ার । আপনি গ্লোবগুলিতে ডটফাইলগুলি এর সাথে অন্তর্ভুক্ত করতে পারেন:
FIGNORE='@(.|..)'
পক্ষান্তরে bash
এর GLOBIGNORE
, যে সঠিকভাবে সম্পন্ন এবং এর সমস্যা সমাধান করা হয়েছে .*
সহ .
এবং ..
।
যশ
yash
একটি dot-glob
বিকল্প আছে ( set -o dot-glob
), কিন্তু এর বিপরীতে bash
, গ্লোব সম্প্রসারণ (এমনকি এর *
) এর অন্তর্ভুক্ত রয়েছে .
এবং ..
তাই এটি বেশ অকেজো।
tcsh শেল
set globdot
মধ্যে মত কাজ করে bash
, অর্থাৎ *
ব্যতীত ডট ফাইল অন্তর্ভুক্ত .
এবং ..
কিন্তু .*
এখনও রয়েছে .
এবং ..
(এবং আপনি ব্যবহার করতে পারেন [.]*
ব্যতীত লুকানো ফাইল প্রসারিত করতে .
এবং ..
)।