ডিরেক্টরি কীভাবে পরীক্ষা করবেন তা ফাঁকা


15

আমার একটি আবশ্যকতা আছে, আমি যদি ./123ফাঁকা পথের একটি আর্গুমেন্ট সহ কোনও স্ক্রিপ্ট সম্পাদন করি তবে বলুন /usr/share/linux-headers-3.16.0-34-generic/.tmp_versions(এই ডিরেক্টরিটি খালি রয়েছে)। এটি "ডিরেক্টরি খালি" প্রদর্শন করা উচিত

আমার কোডটি হ'ল:

#!/bin/bash
dir="$1"

if [ $# -ne 1 ]
then
    echo "please pass arguments" 
exit
fi

if [ -e $dir ]
then
printf "minimum file size: %s\n\t%s\n" \
 $(du $dir -hab | sort -n -r | tail -1)

printf "maximum file size: %s\n\t%s\n" \
 $(du $dir -ab | sort -n | tail -1)

printf "average file size: %s"
du $dir -sk | awk '{s+=$1}END{print s/NR}'
else
   echo " directory doesn't exists"
fi

if [ -d "ls -A $dir" ]
 then
    echo " directory is  empty"
fi

আমার স্ক্রিপ্টের নামটি চালিত হলে এই ত্রুটির প্রদর্শন হয় ./123 /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions(এই ডিরেক্টরিটি ফাঁকা)।

minimum file size: 4096
    /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions
maximum file size: 4096
    /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions
average file size: 4

কেবলমাত্র "ডিরেক্টরি খালি" আউটপুট দেখানোর পরিবর্তে উপরের আউটপুটটি দেখায়

আমি যদি সঠিক তর্ক দিয়ে স্ক্রিপ্টটি অতিক্রম করি তবে নীচের আউটপুটটি প্রদর্শন করতে হবে (আমি সঠিক ডিরেক্টরি পাথ দিয়ে বোঝাচ্ছি)। বলে./123 /usr/share

minimum file size: 196
        /usr/share
    maximum file size: 14096
        /usr/share
    average file size: 4000

আমার প্রত্যাশিত ফলাফল: ./123 /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions

directory is empty.


কেউ দয়া করে একবার আমার কোড চেক করতে পারেন। আমি এটি সম্পাদনা করেছি
বুদ্ধা শ্রীকণ্ত

উত্তর:


20
if    ls -1qA ./somedir/ | grep -q .
then  ! echo somedir is not empty
else  echo somedir is empty
fi

উপরেরটি একটি পসিক্স-সামঞ্জস্যপূর্ণ পরীক্ষা - এবং এটি খুব দ্রুত হওয়া উচিত। lsএকটি ডিরেক্টরি বাদে সব ফাইল / dirs তালিকা প্রস্তুত করা যাবে .এবং ..প্রতি লাইনে প্রতিটি এক হবে -qসমস্ত অ-মুদ্রণযোগ্য অক্ষর uote (অন্তর্ভুক্ত করা \newlines) একটি সঙ্গে আউটপুটে ?প্রশ্নোত্তর চিহ্ন। এইভাবে যদি grepইনপুটটিতে এমনকি একটি একক অক্ষরও গ্রহণ করে তবে তা সত্য হবে - অন্যথায় মিথ্যা।

এটি একা পসিক্স শেল করতে করতে:

cd  ./somedir/ || exit
set ./* ./.[!.]* ./..?*
if   [ -n "$4" ] ||
     for e do 
         [ -L "$e" ] ||
         [ -e "$e" ] && break
     done
then ! echo somedir is not empty
else   echo somedir is empty
fi
cd "$OLDPWD"

একজন POSIX-শেল (যা না তার আগে নিষ্ক্রিয় করা আছে -filename প্রজন্মের) হবে পারেন আক্ষরিক দ্বারা অনুসরণ স্ট্রিং অবস্থানগত-প্যারামিটার অ্যারের কমান্ড উপরে, অথবা অন্য প্রতিটি শেষে উল্লিখিত glob অপারেটার দ্বারা উত্পন্ন ক্ষেত্র রয়েছে। এটি কী করে তা গ্লোবগুলি আসলে কোনও কিছুর সাথে মেলে কিনা তার উপর নির্ভরশীল। কিছু শেলের মধ্যে আপনি একটি অ-সমাধানকারী গ্লোবকে নালায় প্রসারিত করতে নির্দেশ দিতে পারেন - বা কিছুই নয়। এটি কখনও কখনও উপকারী হতে পারে তবে এটি বহনযোগ্য নয় এবং প্রায়শই অতিরিক্ত সমস্যাগুলির সাথে আসে - যেমন বিশেষ শেল-বিকল্পগুলি সেট করে রাখা এবং পরে সেগুলি আনসেট না করে।set"$@"set

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

শেলের উপরে কেবলমাত্র -eঅস্তিত্বের জন্য যে কোনও ফাইলের পরীক্ষা করা হয় যদি নির্দিষ্ট করা তিনটি গ্লোবগুলির মধ্যে একটিতেও একটির চেয়ে বেশি সংখ্যক সমাধান না হয়। সুতরাং forলুপটি কেবল সর্বদা তিন বা কম পুনরাবৃত্তির জন্য চালানো হয় এবং কেবল একটি খালি ডিরেক্টরি ক্ষেত্রে বা এক বা একাধিক নিদর্শন কেবল একটি একক ফাইলের মধ্যে সমাধান হয়। forএছাড়াও breakগুলি যদি globs কোন প্রকৃত ফাইল প্রতিনিধিত্ব - এবং হিসাবে আমি সম্ভবত অন্তত সবচেয়ে ক্রমানুসারে globs আয়োজন করে সম্ভবত, এটা প্রায় কাছাকাছি প্রত্যেক সময় প্রথম পুনরাবৃত্তির উপর প্রস্থান করা উচিত নয়।

যেভাবেই আপনি এটি করেন কেবল একটি একক সিস্টেম stat()কল - শেল এবং lsউভয়েরই কেবল stat()ডিরেক্টরিটি অনুসন্ধান করা উচিত এবং ফাইলগুলির তালিকাভুক্ত করা উচিত যা এর ডেন্ট্রিগুলিতে রয়েছে report এটি এমন আচরণের দ্বারা বিপরীত হয় findযার পরিবর্তে stat()প্রতিটি ফাইল আপনি এর সাথে তালিকাবদ্ধ করতে পারেন।


নিশ্চিত করতে পারেন. আমি লিখেছি স্ক্রিপ্টগুলিতে আমি মাইকজারের প্রাথমিক উদাহরণ ব্যবহার করি।
ওথিয়াস

এটি এমন খালি ডিরেক্টরি হিসাবে রিপোর্ট করবে যা অস্তিত্বহীন নয় বা যার জন্য আপনার পঠনের অ্যাক্সেস নেই। দ্বিতীয়টির জন্য, যদি আপনার অ্যাক্সেস পড়ে থাকে তবে অনুসন্ধান অ্যাক্সেস না থাকলে, ওয়াইএমএমভি।
স্টাফেন চেজেলাস 20'15

@ স্টাফেনচেজেলাস - সম্ভবত, তবে এই জাতীয় প্রতিবেদনের সাথে ত্রুটি বার্তাগুলির সাথে এ জাতীয় ব্যবহারকারীকে অবহিত করা হবে।
মাইকজার্ভ

1
কেবল lsক্ষেত্রে। গ্লোবস এবং [তাদের অ্যাক্সেস না থাকলে চুপ করে থাকে। উদাহরণস্বরূপ, [ -e /var/spool/cron/crontabs/stephane ]নিঃশব্দে মিথ্যা প্রতিবেদন করবে, যখন সেই নামে কোনও ফাইল রয়েছে।
স্টাফেন চেজেলাস

আরও মনে রাখবেন যে স্যামডির কোনও ডিরেক্টরিতে (বা ডিরেক্টরি নয়) একটি সিমিলিংক হলে সেই সমাধানগুলি সমতুল্য নয়।
স্টাফেন চেজেলাস 20'15

6

জিএনইউ বা আধুনিক বিএসডি সহ find, আপনি এটি করতে পারেন:

if find -- "$dir" -prune -type d -empty | grep -q .; then
  printf '%s\n' "$dir is an empty directory"
else
  printf >&2 '%s\n' "$dir is not empty, or is not a directory" \
                    "or is not readable or searchable in which case" \
                    "you should have seen an error message from find above."
fi

(অনুমান $dirএকটি বলে মনে হচ্ছে না findসম্পৃক্ত ( !, (, -name...)।

POSIXly:

if [ -d "$dir" ] && files=$(ls -qAL -- "$dir") && [ -z "$files" ]; then
  printf '%s\n' "$dir is an empty directory"
else
  printf >&2 '%s\n' "$dir is not empty, or is not a directory" \
                    "or is not readable or searchable in which case" \
                    "you should have seen an error message from ls above."
fi

4

[-z $dir ]অভিযোগ করে যে [-zবেশিরভাগ সিস্টেমে কোনও আদেশ নেই । বন্ধনীগুলির চারপাশে আপনার স্পেস দরকার

[ -z $dir ]dirখালি হলে সত্য হতে দেখা যায় এবং অন্যান্য মানগুলির জন্য এটি মিথ্যা dir, তবে এটি বিশ্বাসযোগ্য নয়, উদাহরণস্বরূপ এটি সত্য যদি মান dirহয় = -zবা হয় -o -o -n -nকমান্ড বিকল্পের চারপাশে সর্বদা ডাবল উদ্ধৃতি ব্যবহার করুন (এটি আপনার স্ক্রিপ্টের বাকী অংশেও যায়)।

[ -z "$dir" ]ভেরিয়েবলের মান dirখালি কিনা তা পরীক্ষা করে । ভেরিয়েবলের মান একটি স্ট্রিং, যা ডিরেক্টরিতে যাওয়ার পথ হয়ে থাকে। এটি আপনাকে ডিরেক্টরি সম্পর্কে নিজেই কিছু বলবে না।

ডিরেক্টরি খালি আছে কিনা তা পরীক্ষা করার জন্য কোনও অপারেটর নেই, যেমন নিয়মিত ফাইলের জন্য রয়েছে ( [ -s "$dir" ]ডিরেক্টরিটি খালি থাকলেও এটি সত্য)। ডিরেক্টরি ফাঁকা আছে কিনা তা পরীক্ষার একটি সহজ উপায় হ'ল এর সামগ্রী তালিকাভুক্ত করা; আপনি যদি খালি পাঠ্য পান তবে ডিরেক্টরিটি খালি।

if [ -z "$(ls -A -- "$dir")" ]; then 

পুরানো সিস্টেমে যেগুলি নেই ls -A, আপনি ব্যবহার করতে পারেন ls -aতবে তারপরে .এবং ..তালিকাবদ্ধ থাকে।

if [ -z "$(LC_ALL=C ls -a -- "$dir")" = ".
.." ]; then 

(যে ..স্ট্রিংটির সাথে শুরু হয় সেটিকে ইন্ডেন্ট করবেন না যেহেতু স্ট্রিংটিতে অবশ্যই একটি নতুন লাইন থাকতে হবে, একটি নতুন লাইন এবং অতিরিক্ত স্থান নয়))


আপনি দয়া করে এই অংশটি "$ (ls -A -" ir dir ")" ব্যাখ্যা করতে পারেন। ব্র্যাকেটের ভিতরে এবং বাইরে কি করে?
বুদ্ধা শ্রীকণ্ঠ

@ বুধস্রীকান্ত $(…)হ'ল কমান্ড প্রতিস্থাপন
গিলস

@ গাইলস "$ (ls -A -" ir dir ")" এর নিক্ষেপ ত্রুটি কাজ করছে না।
বুদ্ধা শ্রীকণ্ত

@ বুধস্রীকান্ত ত্রুটি কি? কপি-পেস্ট করুন। আপনি ঠিক কী পর্যবেক্ষণ করছেন তা ব্যাখ্যা না করে আপনি যদি "কাজ না করে" বলে থাকেন তবে লোকেরা আপনাকে সহায়তা করবে বলে আপনি আশা করতে পারবেন না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস এটি ত্রুটি। আমি যখন আমার স্ক্রিপ্টটি সম্পাদন করেছি। / ফাইলটি তার নিক্ষেপ ত্রুটিটি কার্যকর করে .. $ / ফাইলস্ট্যাটস / হোম / শ্রীকান্ত / টেস্টডির / আকি / স্ক্যাটজ ন্যূনতম ফাইলের আকার: 4096 / হোম / শ্রীকান্ত / টেস্টডির / আকি / স্ক্যাটজ সর্বাধিক ফাইলের আকার: 4096 / বাড়ি / শ্রীকণ্ঠ / testdir / aki / schatz গড় ফাইল আকার: 4 ডিরেক্টরি খালি। "ডিরেক্টরি খালি" দেখানোর পরিবর্তে। এটি সর্বনিম্ন আকার, সর্বোচ্চ আকার এবং গড় আকারের সাথে প্রদর্শিত হচ্ছে ing
বুদ্ধা শ্রীকণ্ঠ

3

আপনি নিজেই ডিরেক্টরিটির বৈশিষ্ট্যগুলি দেখছেন।

$ mkdir /tmp/foo
$ ls -ld /tmp/foo
drwxr-xr-x 2 jackman jackman 4096 May  8 11:32 /tmp/foo
# ...........................^^^^

আপনি সেখানে কতগুলি ফাইল রয়েছে তা গণনা করতে চান:

$ dir=/tmp/foo
$ shopt -s nullglob
$ files=( "$dir"/* "$dir"/.* )
$ echo ${#files[@]}
2
$ printf "%s\n" "${files[@]}"
/tmp/foo/.
/tmp/foo/..

সুতরাং, "ডিরেক্টরি খালি" এর পরীক্ষাটি হ'ল:

function is_empty {
    local dir="$1"
    shopt -s nullglob
    local files=( "$dir"/* "$dir"/.* )
    [[ ${#files[@]} -eq 2 ]]
}

এটার মত:

$ if is_empty /tmp/foo; then echo "it's empty"; else echo "not empty"; fi
it's empty
$ touch /tmp/foo/afile
$ if is_empty /tmp/foo; then echo "it's empty"; else echo "not empty"; fi
not empty

এটি যদি আপনার কাছে পাঠ্য অ্যাক্সেস না রাখে বা এটি বিদ্যমান না থাকে তবে ডিরেক্টরিটি খালি রয়েছে report
স্টাফেন চেজেলাস

1

আমার 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 nullglobLHS উপর কমান্ড স্ট্রিং করা "$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 *


$(set -f; echo "$1"/*)লেখার একটি বরং জটিল পদ্ধতি বলে মনে হচ্ছে "$1/*"। এবং এটি লুকানো ডিরেক্টরি বা ফাইলগুলির সাথে মেলে না।
মুড়ু

আমি কি বোঝানো কোন ফাইলের নাম সম্প্রসারণ আছে যে "$1/*"(নোট উদ্ধৃতি অংশটুকু অন্তর্ভুক্ত *), তাই set -fএবং subshell অপ্রয়োজনীয় হয় যে বিশেষ করে।
মুড়ু

এটি একটি পৃথক প্রশ্নের উত্তর দেয়: ডিরেক্টরিতে কোনও লুকানো ফাইল বা ডিরেক্টরি রয়েছে কিনা। এই ব্যাপারে আমি দুক্ষিত. আমি এটি মুছে ফেলতে খুশি হব।
ডোমিনিক 108

1
সেখানে উপায়ে খুব লুকানো ফাইল মেলে (ইন জটিল উল্লিখিত glob দেখতে হয় mikeserv এর উত্তর : ./* ./.[!.]* ./..?*)। ফাংশনটি সম্পূর্ণ করার জন্য আপনি এটি অন্তর্ভুক্ত করতে পারেন।
মুড়ু

আহ! আমি এটি দেখব এবং শিখব এবং সম্ভবত আমাদের গ্লোববিং বিস্তারের উপর ভিত্তি করে একটি সম্পূর্ণ উত্তর হবে!
ডোমিনিক 108

0

এটি করার আরও একটি সহজ উপায় এখানে। ধরে নিন যে শূন্যতার জন্য আপনি যে ডিরেক্টরিটি পরীক্ষা করতে চান সেটি ডি পুরো পথ নাম।

তারপর

if [[ $( du -s  D |awk ' {print $1}') = 0 ]]
then
      echo D is empty
fi

এটি কাজ করে কারণ

du -s D

আউটপুট হিসাবে আছে

size_of_D   D

awk ডি সরিয়ে দেয় এবং যদি আকার 0 হয় তবে ডিরেক্টরিটি খালি থাকে।


-1
#/bin/sh

somedir=somedir
list="`echo "$somedir"/*`"

test "$list" = "$somedir/*" && echo "$somedir is empty"

# dot prefixed entries would be skipped though, you have to explicitly check them

2
হাই এবং সাইটে আপনাকে স্বাগতম। দয়া করে এমন উত্তর পোস্ট করবেন না যা কেবল কোড এবং কোনও ব্যাখ্যা নেই। কোডটি মন্তব্য করুন বা অন্যথায় আপনি কী করছেন তা ব্যাখ্যা করুন। যাইহোক, ব্যবহার করার কোনও কারণ নেই echo, আপনার যা প্রয়োজন তা হ'ল list="$somedir/*"। এছাড়াও, এটি জটিল এবং ত্রুটির প্রবণ। আপনি উল্লেখ করেননি যে ওপিটির অনুসরণীয় স্ল্যাশ সহ টার্গেট দিরের পথ দেওয়া উচিত।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.