আমার tldr উত্তর:
function emptydir {
[ "$1/"* "" = "" ] 2> /dev/null &&
[ "$1/"..?* "" = "" ] 2> /dev/null &&
[ "$1/".[^.]* "" = "" ] 2> /dev/null ||
[ "$1/"* = "$1/*" ] 2> /dev/null && [ ! -e "$1/*" ] &&
[ "$1/".[^.]* = "$1/.[^.]*" ] 2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
[ "$1/"..?* = "$1/..?*" ] 2> /dev/null && [ ! -e "$1/..?*" ]
}
এটি পসিক্স অনুগত এবং এটি যে খুব বেশি গুরুত্ব দেয় তা নয়, এটি সাধারণত সমাধানটি যে ডিরেক্টরিটি তালিকাভুক্ত করে এবং আউটপুটটিকে গ্রেপ হিসাবে পাইপ করে তার চেয়ে দ্রুততর।
ব্যবহার:
if emptydir adir
then
echo "nothing found"
else
echo "not empty"
fi
আমি উত্তরটি https://unix.stackexchange.com/a/202276/160204 পছন্দ করি , যা আমি আবার লিখি:
function emptydir {
! { ls -1qA "./$1/" | grep -q . ; }
}
এটি ডিরেক্টরিটি তালিকাভুক্ত করে এবং ফলাফলটি গ্রেপ-তে পাইপ করে। পরিবর্তে, আমি একটি সাধারণ ফাংশন প্রস্তাব করি যা গ্লোব সম্প্রসারণ এবং তুলনার উপর ভিত্তি করে।
function emptydir {
[ "$(shopt -s nullglob; echo "$1"/{,.[^.],..?}*)" = "" ]
}
এই ফাংশনটি স্ট্যান্ডার্ড পসিক্স নয় এবং এর সাথে একটি সাবশেল কল করে $()
। আমি প্রথমে এই সহজ ফাংশনটি ব্যাখ্যা করি যাতে আমরা চূড়ান্ত সমাধানটি আরও ভালভাবে বুঝতে পারি (উপরের tldr উত্তরটি দেখুন) পরে।
ব্যাখ্যা:
বর্ধিত হাতটি (এলএইচএস) ফাঁকা থাকে যখন কোনও প্রসার ঘটে না, যা ডিরেক্টরি খালি হলে কেস হয়। নাল্ল্লোব বিকল্পটি প্রয়োজনীয় কারণ অন্যথায় যখন কোনও মিল নেই, গ্লোব নিজেই বিস্তারের ফলাফল। (আরএইচএস থাকা এলএইচএসের গ্লোবগুলির সাথে মেলে যখন ডিরেক্টরি খালি থাকে তবে মিথ্যা পজিটিভের কারণে কাজ হয় না যখন এলএইচএস গ্লোব নিজেই গ্লোব হিসাবে পরিচিত একটি ফাইলের সাথে মেলে: গ্লোব- এ ফাইলের নামের সাথে *
থাকা স্ট্রিংয়ের *
সাথে মেলে । ) বক্রবন্ধনী অভিব্যক্তি {,.[^.],..?}
কভার লুকানো ফাইল, কিন্তু না ..
বা .
।
যেহেতু (একটি সাবশেল) shopt -s nullglob
ভিতরে মৃত্যুদন্ড কার্যকর করা হয় $()
, এটি nullglob
বর্তমান শেলটির বিকল্প পরিবর্তন করে না , যা সাধারণত একটি ভাল জিনিস। অন্যদিকে, স্ক্রিপ্টগুলিতে এই বিকল্পটি সেট করা ভাল ধারণা, কারণ কোনও ম্যাচ না থাকলে গ্লোব এমন কিছু ফিরিয়ে দেয় যে এটি ত্রুটিযুক্ত। সুতরাং, কেউ স্ক্রিপ্টের শুরুতে নাল্লগ্লাব বিকল্পটি সেট করতে পারে এবং এটি ফাংশনে এটির প্রয়োজন হবে না। আসুন এটি মাথায় রাখুন: আমরা এমন একটি সমাধান চাই যা নলগ্লোব বিকল্পের সাথে কাজ করে।
আদেশ সহকারে:
আমাদের যদি ডিরেক্টরিতে অ্যাক্সেস না থাকে তবে ফাংশনটি একইভাবে প্রতিবেদন করে যে কোনও খালি ডিরেক্টরি রয়েছে। এটি ডিরেক্টরিতে তালিকাবদ্ধ করে আউটপুট গ্রেপ করে এমন একটি ফাংশনেও প্রযোজ্য p
shopt -s nullglob
কমান্ড মান POSIX নয়।
এটি তৈরি করা সাবশেল ব্যবহার করে $()
। এটি কোনও বড় বিষয় নয়, তবে এটি এড়াতে পারলে ভালো nice
প্রো:
এটি সত্যিই গুরুত্বপূর্ণ তা নয়, তবে এই ফাংশনটি পূর্বেরটির চেয়ে চারগুণ দ্রুত, প্রক্রিয়াটির মধ্যে কার্নেলটিতে সিপিইউ সময় ব্যয় করে পরিমাপ করা হয়।
অন্যান্য সমাধান:
আমরা অ POSIX অপসারণ করতে পারেন shopt -s nullglob
LHS উপর কমান্ড স্ট্রিং করা "$1/* $1/.[^.]* $1/..?*"
RHS এবং আলাদাভাবে মিথ্যা positives যে ঘটতে নিষ্কাশন যখন আমরা শুধুমাত্র নামে ফাইল আছে '*'
, .[^.]*
বা ..?*
ডিরেক্টরির মধ্যে:
function emptydir {
[ "$(echo "$1"/{,.[^.],..?}*)" = "$1/* $1/.[^.]* $1/..?*" ] &&
[ ! -e "$1/*" ] && [ ! -e "$1/.[^.]*" ] && [ ! -e "$1/..?*" ]
}
shopt -s nullglob
কমান্ড ব্যতীত এখন সাবশেলটি সরিয়ে ফেলার জন্য এটি বোধগম্য, তবে আমাদের সতর্কতা অবলম্বন করতে হবে কারণ আমরা শব্দ বিভাজন এড়াতে এবং এখনও এলএইচএসে গ্লোব সম্প্রসারণের অনুমতি দিতে চাই। বিশেষত শব্দ বিভাজন এড়াতে উদ্ধৃতি কার্যকর হয় না, কারণ এটি গ্লোব সম্প্রসারণকেও বাধা দেয়। আমাদের সমাধান হ'ল গ্লোবগুলি পৃথকভাবে বিবেচনা করা:
function emptydir {
[ "$1/"* = "$1/*" ] 2> /dev/null && [ ! -e "$1/*" ] &&
[ "$1/".[^.]* = "$1/.[^.]*" ] 2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
[ "$1/"..?* = "$1/..?*" ] 2> /dev/null && [ ! -e "$1/..?*" ]
}
আমাদের কাছে পৃথক গ্লোবটির জন্য এখনও শব্দ বিভাজন রয়েছে, তবে এটি এখন ঠিক আছে, কারণ ডিরেক্টরিটি খালি না হলে এটি কেবল ত্রুটির ফলস্বরূপ। যখন এলএইচএসে প্রদত্ত গ্লোবটির সাথে অনেকগুলি ফাইল মিলছে তখন ত্রুটি বার্তাটি বাতিল করতে আমরা 2> / dev / নাল যুক্ত করেছি।
আমরা স্মরণ করি যে আমরা এমন একটি সমাধান চাই যা নাল্লগ্লাব বিকল্পের সাথে কাজ করে। উপরের সমাধানটি নালগ্লোব বিকল্পের সাথে ব্যর্থ হয়, কারণ ডিরেক্টরিটি খালি থাকলে, এলএইচএসও খালি থাকে। ভাগ্যক্রমে, এটি কখনই বলে না যে ডিরেক্টরিটি যখন না থাকে তখন খালি থাকে। এটি কেবল খালি থাকে তা বলতে ব্যর্থ হয়। সুতরাং, আমরা পৃথকভাবে নালগ্লোব বিকল্প পরিচালনা করতে পারি। আমরা সহজভাবে কেস [ "$1/"* = "" ]
ইত্যাদি যুক্ত করতে পারি না কারণ এগুলি প্রসারণযোগ্য হবে [ = "" ]
ইত্যাদি ইত্যাদি যা সিন্টেক্সিকভাবে ভুল। সুতরাং, আমরা [ "$1/"* "" = "" ]
পরিবর্তে ইত্যাদি ব্যবহার। আমাদের আবার তিনটি কেস বিবেচনা করতে হবে *
, ..?*
এবং .[^.]*
লুকানো ফাইলগুলির সাথে মিল রাখতে হবে, .
এবং না..
। নালগ্লোব বিকল্প না থাকলে এগুলি হস্তক্ষেপ করবে না, কারণ তারা কখনও বলে না যে এটি যখন খালি হয় তখন তা হয় না। সুতরাং, চূড়ান্ত প্রস্তাবিত সমাধানটি হ'ল:
function emptydir {
[ "$1/"* "" = "" ] 2> /dev/null &&
[ "$1/"..?* "" = "" ] 2> /dev/null &&
[ "$1/".[^.]* "" = "" ] 2> /dev/null ||
[ "$1/"* = "$1/*" ] 2> /dev/null && [ ! -e "$1/*" ] &&
[ "$1/".[^.]* = "$1/.[^.]*" ] 2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
[ "$1/"..?* = "$1/..?*" ] 2> /dev/null && [ ! -e "$1/..?*" ]
}
সুরক্ষা উদ্বেগ:
দুটি ফাইল rm
এবং x
একটি খালি ডিরেক্টরি তৈরি *
করুন এবং প্রম্পটে কার্যকর করুন। গ্লোব *
প্রসারিত হবে rm x
এবং এটি সরানোর জন্য কার্যকর করা হবে x
। এটি কোনও সুরক্ষা উদ্বেগ নয়, কারণ আমাদের কার্যক্রমে, গ্লোবগুলি সেখানে অবস্থিত যেখানে বিস্তৃতিগুলি কমান্ড হিসাবে দেখা যায় না, বরং যুক্তির মতো দেখা যায় for f in *
।