কোনও ডিরেক্টরিতে ফাইল রয়েছে কিনা শেল স্ক্রিপ্ট থেকে চেক করা হচ্ছে


116

শেল স্ক্রিপ্ট থেকে, কোনও ডিরেক্টরিতে ফাইল রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?

এর সাথে কিছু মিল

if [ -e /some/dir/* ]; then echo "huzzah"; fi;

কিন্তু ডিরেক্টরিতে যদি এক বা একাধিক ফাইল থাকে (তবে উপরেরটি কেবলমাত্র 0 বা 1 ফাইলের সাথে কাজ করে) কাজ করে।


আপনার উদাহরণটি মূল্যবান তার জন্য ভাল আপনি ksh এবং zsh এ যা চান তা করতে পারে
ডেভ ওয়েব

2
@ ডেভ ওয়েব না এটি করেনা। যদি গ্লোব একাধিক শব্দের কাছে প্রসারিত হয় তবে zsh পরীক্ষার রিপোর্ট 'পরীক্ষা: অনেকগুলি আর্গুমেন্ট'।
জেনস

"হুজাহ" এর অর্থ "ডিরেক্টরিটি খালি নেই"।
ফ্যানরল

ডিরেক্টরিতে যদি কেবল একটি খালি উপ ডিরেক্টরি থাকে তবে সেই ফাইলটি "ফাইলযুক্ত" হিসাবে গণ্য হবে?
কিথ থমসন

উত্তর:


72

সমাধান এখন পর্যন্ত ব্যবহার ls। এখানে একটি সমস্ত বাশ সমাধান রয়েছে:

#!/bin/bash
shopt -s nullglob dotglob     # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi

8
যতক্ষণ না আপনি স্ক্রিপ্টের শেষে বিকল্পগুলি তাদের মূল মূল্যে ফিরে যেতে স্মরণ করেছেন :)
জিন

এটি একটি সামান্য উন্নত সংস্করণ যা ব্যাশ সেটিংস পুনরায় সেট করার জন্য যত্ন নেয়:shopt -q nullglob || resetnullglob=1; shopt -s nullglob; shopt -q dotglob || resetdotglob=1; shopt -s dotglob; files=(/some/dir/*); [ "$files" ] && echo "wowzers"; [ "$resetdotglob" ] && shopt -u dotglob; [ "$resetnullglob" ] && shopt -u nullglob;
ব্যবহারকারী 123444555621

12
সেটিংসটি পুনরায় সেট করতে কেন একটি সাবশেল ব্যবহার করবেন না:files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*)
টিমবব

7
@teambob যদি একটি সাব-শেল ব্যবহার করে: files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*) তবে যদি বিবৃতিটি পরিবর্তিত হয় if [ ${#files} -gt 0 ];বা আপনি কি সাব-শেল কমান্ডের আশেপাশে () ভুলে গেছেন? files=($(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*))
stoutyhk

2
@stoutyhk $ (...) সেটিংস পুনরুদ্ধার করে, কোনও পৃথক সাব-শেল প্রয়োজন হয় না। $ (...) ব্যবহার করে শেলের নতুন উদাহরণ তৈরি হয়েছে। কমান্ডটি শেষ হয়ে গেলে এই নতুন উদাহরণটির পরিবেশটি ফেলে দেওয়া হয়। সম্পাদনা করুন: tldp.org/LDP/abs/html/commandsub.html একটি রেফারেন্স পাওয়া গেছে "কমান্ড প্রতিস্থাপন একটি সাব-শেল আহ্বান করে।"
টিমবব

139

তিনটি সেরা কৌশল


shopt -s nullglob dotglob; f=your/dir/*; ((${#f}))

এই কৌশলটি 100% bashএবং একটি উপ-শেলটি আহরণ করে (স্প্যান করে)। ধারণাটি ব্রুনো ডি ফ্রেইনের এবং টিমবোবের মন্তব্য দ্বারা উন্নত ।

files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
  echo "contains files"
else 
  echo "empty (or does not exist or is a file)"
fi

দ্রষ্টব্য: একটি খালি ডিরেক্টরি এবং একটি বিদ্যমান নেই (এবং সরবরাহকৃত পথটি একটি ফাইল থাকা সত্ত্বেও) এর মধ্যে কোনও পার্থক্য নেই।

# ব্যাশ আইআরসি চ্যানেলের জন্য 'অফিসিয়াল' এফএকিউতে একটি অনুরূপ বিকল্প এবং আরও বিশদ (এবং আরও উদাহরণ) রয়েছে :

if (shopt -s nullglob dotglob; f=(*); ((${#f[@]})))
then
  echo "contains files"
else 
  echo "empty (or does not exist, or is a file)"
fi

[ -n "$(ls -A your/dir)" ]

এই কৌশলটি নিক্সক্রাফ্টের 2007 সালে পোস্ট করা নিবন্ধ থেকে অনুপ্রাণিত হয়েছে 2>/dev/nullthe আউটপুট ত্রুটি দমন করতে যুক্ত করুন "No such file or directory"
আরও দেখুন অ্যান্ড্রু টেলর এর উত্তর (2008) এবং gr8can8dian এর উত্তর (2011)।

if [ -n "$(ls -A your/dir 2>/dev/null)" ]
then
  echo "contains files (or is a file)"
else
  echo "empty (or does not exist)"
fi

বা এক-লাইন বাশিজম সংস্করণ:

[[ $(ls -A your/dir) ]] && echo "contains files" || echo "empty"

দ্রষ্টব্য: ডিরেক্টরিটি উপস্থিত না থাকলে lsফিরে আসে $?=2। তবে কোনও ফাইল এবং একটি খালি ডিরেক্টরিতে কোনও পার্থক্য নেই।


[ -n "$(find your/dir -prune -empty)" ]

এই শেষ কৌশলটি গ্রাভস্টারের উত্তর থেকে অনুপ্রাণিত হয়েছে যেখানে ফিল্সের মন্তব্যে -maxdepth 0প্রতিস্থাপন -pruneএবং উন্নত করা হয়েছে ।

if [ -n "$(find your/dir -prune -empty 2>/dev/null)" ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

ব্যবহার করে একটি প্রকরণ -type d:

if [ -n "$(find your/dir -prune -empty -type d 2>/dev/null)" ]
then
  echo "empty directory"
else
  echo "contains files (or does not exist or is not a directory)"
fi

ব্যাখ্যা:

  • find -prunefind -maxdepth 0কম অক্ষর ব্যবহার করার মতোই
  • find -empty খালি ডিরেক্টরি এবং ফাইল মুদ্রণ
  • find -type d ডিরেক্টরি মুদ্রণ

দ্রষ্টব্য: আপনি [ -n "$(find your/dir -prune -empty)" ]নীচের কেবল সংক্ষিপ্ত সংস্করণ দ্বারা প্রতিস্থাপন করতে পারেন :

if [ `find your/dir -prune -empty 2>/dev/null` ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

এই শেষ কোডটি বেশিরভাগ ক্ষেত্রে কাজ করে তবে সচেতন থাকুন যে দূষিত পথগুলি কোনও আদেশটি প্রকাশ করতে পারে ...


2
আমি মনে করি [ -n "$(find "your/dir" -prune -empty)" ]ডিরেক্টরি পথটির পুনরাবৃত্তি এড়াতে আপনি অনুসন্ধান বিকল্পটি সহজ করতে পারেন ।
ফিল্ডস

if [ ``ls -A your/dir`` ]স্ক্রিপ্ট ব্যবহার করার সময় আমি এই সিদ্ধান্তে পৌঁছেছি যে এটি 0, 1 বা 2 উপ-ডিরেক্টরি সহ একটি ডিরেক্টরিতে কার্যকর কাজ করে তবে 2 টিরও অধিক সাব-ডিরেক্টরি সহ ডিরেক্টরিতে ব্যর্থ হয়। ডিরেক্টরি নাম line 17: [: 20150424-002813: unary operator expectedযেখানে 20150424-002813এক ছিল। ব্যবহৃত শেল ছিল /bin/bash/। অবশেষে আমি এটিকে পরিবর্তন করেছিls "$destination" | tail -1
ক্রিস্টোফ ডি ট্রায়ার

হাই ক্রিস্টোফিডে ট্রায়ার আমি আপনার সমস্যাটি পুনরুত্পাদন করতে পারি না। আমার দিকে if [ ``ls -A my/dir`` ]ত্রুটি থেকে প্রস্থান bash: [: -A: binary operator expected। 4.1.2 এবং 4.2.53 বাশ সংস্করণে পরীক্ষিত।
অলিব্রি

1
ঠিক আছে, আমি মূলত অনুমিত অসংগতির কারণে মন্তব্য করতে অনুপ্রাণিত হয়েছিল (যেহেতু -nরূপটি শিরোনামে ছিল তবে নীচের অনুচ্ছেদে নয়)। তো, হ্যাঁ, ঠিক আছে।
ম্যাক্সচলেপজিগ

1
আমি আপনার সমাধান সমাধান ব্যবহার করছি, আমার স্ক্রিপ্ট এখনও এই সম্পর্কে অভিযোগ ls: cannot access '/path': No such file or directory। আমি কি এই উপায়টি দমন করতে পারি? আমি সেখানে চুপচাপ ব্যর্থ হতে চাই।
ফ্রিডো

48

নিম্নলিখিতগুলি সম্পর্কে কীভাবে:

if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

এইভাবে ডিরেক্টরিতে সামগ্রীর সম্পূর্ণ তালিকা উত্পন্ন করার দরকার নেই। readউভয় আউটপুট বাতিল করে শুধুমাত্র যখন কিছু পড়া হয় সত্য নির্ণয় করা অভিব্যক্তি করা হয় (যেমন /some/dir/খালি পাওয়া যায় find)।


3
বা সহজভাবেfind /some/dir/ -maxdepth 0 -empty -exec echo "huzzah" \;
ডাবলডাউন

5
+1 এটি সবচেয়ে মার্জিত সমাধান। এটি lsআউটপুট পার্সিং জড়িত না এবং এটি ডিফল্ট শেল বৈশিষ্ট্যগুলির উপর নির্ভর করে না।

7
এটি অবশ্য অ-মানক -maxdepthএবং -emptyপ্রাথমিকের উপর নির্ভর করে ।
চ্যানার

21

চেষ্টা করুন:

if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi

এটি আমার পক্ষে কাজ করেছে তবে আমি এই * এমএন বার্তাটি ফর্ম্যাট করতে পারি না !!! <br> রফতানি tmp = /bin/ls <some_dir>/* 2> /dev/nullযদি [! -z "$ tmp"]; তারপরে
এ্যাথো সামथিং এথিং

1
আমার মতো বাশ বোকাদের জন্য, আপনি যদি বিপরীতটি পরীক্ষা করতে চান - ডিরেক্টরিটি খালি - কেবল [-z ls /some/dir/*] ব্যবহার করুন ; তারপরে "হুজাহ" প্রতিধ্বনি করুন; ফাই
ক্রিস মোসচিনি

4
আপনি এর -nপরিবর্তে ব্যবহার করতে পারেন ! -z(এগুলি উভয়ই সমতুল্য, তবে এটি উপস্থিত থাকলে সংক্ষিপ্ত রূপটি কেন ব্যবহার করবেন না)।
n.st

জেডএসএইচ সহ এই উদাহরণটিতে একটি ত্রুটি ছুঁড়েছে, ধারণাটি ত্রুটিটি ফেলে দেওয়া উচিত নয় ... BigGray% if [ ! -z ls / কিছু / দির / * `]; তারপরে "হুজাহ" প্রতিধ্বনি করুন; ফাই zsh: কোনও মিল খুঁজে পাওয়া যায় নি: / কিছু / দির / * `
Hvisage

না প্রায় ডবল উদ্ধৃতি চিহ্ন বিনা আমার জন্য কাজ ls...ব্যাশ মধ্যে
letmutx

15
# Works on hidden files, directories and regular files
### isEmpty()
# This function takes one parameter:
# $1 is the directory to check
# Echoes "huzzah" if the directory has files
function isEmpty(){
  if [ "$(ls -A $1)" ]; then
    echo "huzzah"
  else 
    echo "has no files"
  fi
}

15

অনেক ফাইল সহ ডিরেক্টরি সহ যত্ন নিন! lsকমান্ডটি মূল্যায়ন করতে কিছুটা সময় নিতে পারে ।

আইএমও সেরা সমাধানটি ব্যবহার করে

find /some/dir/ -maxdepth 0 -empty



4
# ডিরেক্টরিতে কোনও ননহিনড ফাইল রয়েছে কিনা তা যাচাই করে।
#
# ব্যবহার: যদি "OME হোম" isempty হয়; তারপরে "স্বাগতম বাড়িতে" প্রতিধ্বনি; ফাই
#
খালি() {
    ief 1 / * এ _ চার্জের জন্য; করা
        যদি [-e "$ _ چور"]; তারপর
            প্রত্যাবর্তন 1
        ফাই
    সম্পন্ন
    ফিরে 0
}

কিছু বাস্তবায়ন নোট:

  • forলুপ একটি বহিস্থিত একটি কল এড়াতেls প্রক্রিয়া। এটি এখনও একবারে সমস্ত ডিরেক্টরি এন্ট্রি পড়ে। এটি কেবলমাত্র একটি সি প্রোগ্রাম লিখে স্পষ্টতই রিডডিয়ার () ব্যবহার করে অপ্টিমাইজ করা যায়।
  • test -eলুপ ভিতরে একটি ফাঁকা ডিরেক্টরি, যে ক্ষেত্রে পরিবর্তনশীল ক্ষেত্রে ক্যাচ _iefমান "somedir / *" নির্ধারিত হবে। কেবলমাত্র সেই ফাইলটি উপস্থিত থাকলে ফাংশনটি "অমানবিক" ফিরে আসবে
  • এই ফাংশনটি সমস্ত পসিক্স বাস্তবায়নে কাজ করবে। তবে সচেতন থাকবেন যে সোলারিস / বিন / এস এই বিভাগে আসে না। এর testবাস্তবায়ন -eপতাকাটিকে সমর্থন করে না ।

1
এটি dotglobসেট না করা থাকলে ডিরেক্টরিতে ডটফাইল উপেক্ষা করবে -shopt -s dotglob
l0b0

4

ডিরেক্টরিটি খালি আছে কিনা বা এটি না থাকলে এটিতে থাকা ফাইলের সংখ্যাটি এটি আমাকে বলে।

directory="/some/dir"
number_of_files=$(ls -A $directory | wc -l)

if [ "$number_of_files" == "0" ]; then
    echo "directory $directory is empty"
else
    echo "directory $directory contains $number_of_files files"
fi

কেউ আমাকে ব্যাখ্যা করতে পারেন কেন আমাকে নিম্নচাপ দেওয়া হয়েছিল? যদি ক্রেপস লিখছি, আইডি কেন তা জানতে চাই;)
দাইশি

1
আমি এটিকে কম করে দেখিনি, তবে অনুমান করার কারণেই আপনি এর আউটপুট পার্সls করছেন ।
টবি স্পিড

সংযুক্ত নিবন্ধটি কি অস্পষ্ট? যদি তা হয় তবে লেখককে ইমেল করুন (আমাকে নয়)।
টবির স্পিড

1
@ টবিস্পাইট আমি পয়েন্টটি দেখছি তবে এই ক্ষেত্রে আমি লাইনগুলি গণনা করছি না তাদের গণনা করা। কোনও ফাইলের নামটিতে একটি নতুন লাইন রয়েছে তবেই এটির একটি ভুল ফলাফল দেওয়া উচিত। এবং যদি ফাইলের নামগুলিতে নতুন লাইন থাকে, তবে আরও গুরুত্বপূর্ণ কিছু অবশ্যই কোথাও কোথাও বেঁধে থাকতে হবে;)
দাইশি

3

এটি সত্যিই দেরিতে প্রতিক্রিয়া হতে পারে তবে এখানে কার্যকর একটি সমাধান রয়েছে। এই লাইনটি কেবলমাত্র ফাইলের অস্তিত্বকে স্বীকৃতি দেয়! ডিরেক্টরি উপস্থিত থাকলে এটি আপনাকে একটি মিথ্যা ইতিবাচক দেয় না।

if find /path/to/check/* -maxdepth 0 -type f | read
  then echo "Files Exist"
fi

2
dir_is_empty() {
   [ "${1##*/}" = "*" ]
}

if dir_is_empty /some/dir/* ; then
   echo "huzzah"
fi

মনে করুন আপনি নামের একটি ফাইল না থাকে *বা /any/dir/you/check, এটি কাজ করা উচিত bash dash posh busybox shএবং zshকিন্তু (zsh জন্য) প্রয়োজন unsetopt nomatch

পারফরম্যান্সগুলি যে কোনও lsব্যবহার *(গ্লোব) এর সাথে তুলনাযোগ্য হওয়া উচিত , আমার ধারণা অনেক নোডের সাথে ডিরেক্টরিতে ধীর হবে (আমার /usr/bin3000+ ফাইলগুলি ধীরে ধীরে যায় নি), সমস্ত ডায়ার / ফাইলের নাম বরাদ্দ করার জন্য কমপক্ষে মেমরিটি যথেষ্ট পরিমাণে ব্যবহার করবে (এবং আরও) যেহেতু সেগুলি সমস্ত আর্গুমেন্ট হিসাবে ফাংশনে পাস (সমাধান করা) হয়েছে, কিছু শেলের সম্ভবত আর্গুমেন্টের সংখ্যা এবং / অথবা আর্গুমেন্টের দৈর্ঘ্যের সীমা রয়েছে।

কোনও ডিরেক্টরি খালি আছে কিনা তা যাচাই করার জন্য একটি পোর্টেবল ফাস্ট ও (1) শূন্য সংস্থান পদ্ধতিতে ভাল লাগবে।

হালনাগাদ

উপরের সংস্করণটি লুকানো ফাইল / ডায়ারগুলির জন্য অ্যাকাউন্ট করে না, যদি আরও কিছু পরীক্ষার প্রয়োজন is_emptyহয় তবে রিচের শ (পোসিক্স শেল) ট্রিকগুলির মতো :

is_empty () (
cd "$1"
set -- .[!.]* ; test -f "$1" && return 1
set -- ..?* ; test -f "$1" && return 1
set -- * ; test -f "$1" && return 1
return 0 )

তবে পরিবর্তে, আমি এই জাতীয় কিছু নিয়ে ভাবছি:

dir_is_empty() {
    [ "$(find "$1" -name "?*" | dd bs=$((${#1}+3)) count=1 2>/dev/null)" = "$1" ]
}

পিছনের দিক থেকে পার্থক্য কমিয়ে দেওয়ার বিষয়ে কিছুটা উদ্বেগ এবং দির খালি থাকার সময় অনুসন্ধানের আউটপুট এবং নতুন লাইনগুলি অনুসরণ করা (তবে এটি হ্যান্ডেল করা সহজ হওয়া উচিত) দুঃখের সাথে আমার busybox shশোতে সম্ভবত find -> ddপাইপটিতে একটি বাগ কী হতে পারে যা এলোমেলোভাবে কাটা হয় ( যদি আমি ব্যবহার catআউটপুট সবসময় একই মনে করা হয় ddআর্গুমেন্ট সহ count)।


আমি বহনযোগ্য সমাধান পছন্দ। আমি একই উত্তর দিতে এসেছি। আমি এটি আলাদাভাবে লিখেছি (ডিরেক্টরি না হলে 2 ফেরত দিন)। এছাড়াও, এই বহনযোগ্য সমাধানগুলিতে কোনও বাহ্যিক প্রোগ্রামগুলি কল না করার সুবিধা রয়েছে, যা সীমাবদ্ধ বা এম্বেড থাকা সিস্টেমগুলির জন্য প্লাস হিসাবে গণনা করতে পারে। আমি কেবল উদ্বিগ্ন যে "()" ব্যবহার করে একটি নতুন সাবপ্রসেস তৈরি হতে পারে (বা কমপক্ষে পরিবেশ এবং সামগ্রীগুলি অনুলিপি করতে এবং তারপরে ফিরে যেতে বাধ্য করবে)। এটি একবার দেখুন: is_empty () {_d = "$ {1: -।}"; [! -d "$ {_ d}"] & & 2 ফিরে আসুন - সেট করুন - "$ {_ d}" / * "$ {_ d}" /.দেওলি। "* "{{_ d}" /..??? ["$ { }" = "$ {_ d} / $ {_ d} /। [!।] * $ {_ d} /..??"]; };
দিয়েগো আগস্টো মোলিনা

@ ডিগো অগস্টোমোলিনা সম্প্রতি একটি প্রকল্পে আমাকে আবার এই পরীক্ষাটি করতে হয়েছিল, যদি কোনও ডিরেক্টরি খালি থাকে, শুরুতে আমি পাইথন ব্যবহার করি, তবে যেহেতু আমি কার্যতঃ পাইথনটি কেবলমাত্র এটির জন্য ইনস্টল করেছিলাম, আমি সিটিতে পরীক্ষাটি প্রয়োগ করেছিলাম, বাস্তবায়ন চূড়ান্তভাবে হয় ব্যানালিটি, আমি অবাক হয়েছি কেন এটি কখনই পরীক্ষা বা স্ট্যান্ড-
আলেক্স

1
আমিও সম্প্রতি একটি (সত্যিই) সীমাবদ্ধ সিস্টেমের জন্য এই সমস্যার সমাধানের প্রয়োজন ছিল। এমনকি কোনও অতিরিক্ত ভেরিয়েবল ব্যবহার করার জন্য আমি আগের কোডটি কিছুটা অপ্টিমাইজ করেছি। হ্যাকিশ এবং কুরুচিপূর্ণ ওয়াল-লাইনার তবে দুর্দান্ত। নিজেকে পরিবেশন করুন:is_empty(){ [ ! -d "${1}" ] && return 2;set -- "${1}" "${1}"/* "${1}"/.[!.]* "${1}"/..?*;[ "${*}" = "${1} ${1}/* ${1}/.[!.]* ${1}/..?*" ]; };
দিয়েগো অগাস্টো মোলিনা

2

ZSH

আমি জানি প্রশ্নটি বাশের জন্য চিহ্নিত ছিল; তবে zsh ব্যবহারকারীদের জন্য কেবল রেফারেন্সের জন্য :

খালি নয় ডিরেক্টরি জন্য পরীক্ষা

fooখালি নয় কিনা তা পরীক্ষা করতে :

$ for i in foo(NF) ; do ... ; done

যেখানে, fooখালি না থাকলে, forব্লকের কোডটি কার্যকর করা হবে।

খালি ডিরেক্টরি জন্য পরীক্ষা

fooখালি আছে কিনা তা পরীক্ষা করতে :

$ for i in foo(N/^F) ; do ... ; done

যেখানে, fooখালি থাকলে, forব্লকের কোডটি কার্যকর করা হবে।

মন্তব্য

আমাদের fooউপরের ডিরেক্টরিটি উদ্ধৃত করার দরকার ছিল না , তবে আমাদের যদি প্রয়োজন হয় তবে আমরা তা করতে পারি:

$ for i in 'some directory!'(NF) ; do ... ; done

আমরা একাধিক বস্তুরও পরীক্ষা করতে পারি, এটি ডিরেক্টরি না হলেও:

$ mkdir X     # empty directory
$ touch f     # regular file
$ for i in X(N/^F) f(N/^F) ; do echo $i ; done  # echo empty directories
X

ডিরেক্টরি নয় এমন যে কোনও কিছুই কেবল এড়ানো হবে।

অতিরিক্ত

যেহেতু আমরা গ্লোব করছি, আমরা যে কোনও গ্লোব (বা ব্রেস সম্প্রসারণ) ব্যবহার করতে পারি:

$ mkdir X X1 X2 Y Y1 Y2 Z
$ touch Xf                    # create regular file
$ touch X1/f                  # directory X1 is not empty
$ touch Y1/.f                 # directory Y1 is not empty
$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ for i in {X,Y}*(N/^F); do printf "$i "; done; echo  # print empty directories
X X2 Y Y2

আমরা অ্যারেতে রাখা বস্তুগুলিও পরীক্ষা করতে পারি। উপরোক্ত ডিরেক্টরিগুলির সাথে উদাহরণস্বরূপ:

$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ arr=(*)                     # place objects into array "arr"
$ for i in ${^arr}(N/^F); do printf "$i "; done; echo
X X2 Y Y2 Z

সুতরাং, আমরা ইতিমধ্যে একটি অ্যারে প্যারামিটারে সেট করা যেতে পারে এমন বস্তুগুলি পরীক্ষা করতে পারি।

নোট করুন যে forব্লকের কোডটি অবশ্যই প্রতিটি ডিরেক্টরিতে ঘুরিয়ে কার্যকর করা হয়। যদি এটি পছন্দসই না হয় তবে আপনি কেবল একটি অ্যারে প্যারামিটারটি তৈরি করতে পারেন এবং তারপরে সেই পরামিতিটি পরিচালনা করতে পারেন:

$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories

ব্যাখ্যা

জেডএস ব্যবহারকারীদের জন্য রয়েছে গ্লোব (F)কোয়ালিফায়ার (দেখুন man zshexpn), যা "পূর্ণ" (খালি নয়) ডিরেক্টরিগুলির সাথে মেলে:

$ mkdir X Y
$ touch Y/.f        # Y is now not empty
$ touch f           # create a regular file
$ ls -dF *          # list everything in the current directory
f X/ Y/
$ ls -dF *(F)       # will list only "full" directories
Y/

কোয়ালিফায়ার (F)মেলানো অবজেক্টের তালিকা দেয়: এটি একটি ডিরেক্টরি এবং খালি নয়। সুতরাং, (^F)মিলগুলি: কোনও ডিরেক্টরি নয় বা খালি। সুতরাং, (^F)একা যেমন নিয়মিত ফাইলগুলিও তালিকাভুক্ত করে। zshexpম্যান পেজে যেমন ব্যাখ্যা করা হয়েছে , আমাদের (/)গ্লোব কোয়ালিফায়ারও প্রয়োজন , যা কেবল ডিরেক্টরিগুলি তালিকাভুক্ত করে:

$ mkdir X Y Z
$ touch X/f Y/.f    # directories X and Y now not empty
$ for i in *(/^F) ; do echo $i ; done
Z

সুতরাং, প্রদত্ত ডিরেক্টরিটি ফাঁকা আছে কিনা তা পরীক্ষা করতে আপনি চালাতে পারেন:

$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished

এবং কেবল এটি নিশ্চিত করার জন্য যে একটি খালি নয় ডিরেক্টরিটি ক্যাপচার করা হবে না:

$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished

ওহো! যেহেতু Yখালি নয়, zsh (/^F)("ডিরেক্টরিগুলি শূন্য রয়েছে") এর সাথে কোনও মিল খুঁজে পায় না এবং এইভাবে একটি ত্রুটি বার্তা ছড়িয়ে দেয় যে গ্লোবটির জন্য কোনও মিল খুঁজে পাওয়া যায় নি। আমাদের (N)গ্লোব কোয়ালিফায়ার দিয়ে এই সম্ভাব্য ত্রুটি বার্তাগুলি দমন করতে হবে :

$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished

সুতরাং, খালি ডিরেক্টরিগুলির জন্য আমাদের যোগ্যতা প্রয়োজন (N/^F), যা আপনি এই হিসাবে পড়তে পারেন: "ব্যর্থতা সম্পর্কে আমাকে সতর্ক করবেন না, ডিরেক্টরিগুলি পূর্ণ নয়"।

একইভাবে, খালি নয় ডিরেক্টরিগুলির জন্য আমাদের বাছাইপর্বের প্রয়োজন (NF), যা আমরা একইভাবে পড়তে পারি: "ব্যর্থতা, সম্পূর্ণ ডিরেক্টরি সম্পর্কে আমাকে সতর্ক করবেন না"।


1

আমি অবাক হয়েছি খালি ডিরেক্টরিতে wooledge গাইড উল্লেখ করা হয়নি। এই নির্দেশিকাটি এবং সত্যই সমস্ত wooledge শেল ধরণের প্রশ্নের জন্য অবশ্যই পড়তে হবে।

এই পৃষ্ঠা থেকে নোট:

কখনই ls আউটপুট পার্স করার চেষ্টা করবেন না। এমনকি এলএস -এ সমাধানগুলি ভেঙে যেতে পারে (যেমন এইচপি-ইউএক্স-এ, আপনি যদি শিকড় হন তবে ls -A এটির বিপরীত কাজ করে যা আপনি যদি মূল না হন তবে - এবং না, আমি এমন কিছু তৈরি করতে পারি না যে অবিশ্বাস্যভাবে মূঢ়)।

আসলে, কেউ সরাসরি প্রশ্ন সরাসরি এড়াতে চাইতে পারে। সাধারণত লোকেরা ডিরেক্টরিটি ফাঁকা কিনা তা জানতে চায় কারণ তারা এতে ফাইলগুলি জড়িত কিছু করতে চায় ইত্যাদি বৃহত্তর প্রশ্নের দিকে তাকান। উদাহরণস্বরূপ, এই অনুসন্ধান-ভিত্তিক উদাহরণগুলির মধ্যে একটি উপযুক্ত সমাধান হতে পারে:

   # Bourne
   find "$somedir" -type f -exec echo Found unexpected file {} \;
   find "$somedir" -maxdepth 0 -empty -exec echo {} is empty. \;  # GNU/BSD
   find "$somedir" -type d -empty -exec cp /my/configfile {} \;   # GNU/BSD

সর্বাধিক সাধারণভাবে যা যা প্রয়োজন তা হ'ল এরকম কিছু:

   # Bourne
   for f in ./*.mpg; do
        test -f "$f" || continue
        mympgviewer "$f"
    done

অন্য কথায়, প্রশ্ন জিজ্ঞাসা করা ব্যক্তিটি ভেবে থাকতে পারে যে মাইমপভিউয়ের মত একটি ত্রুটি বার্তা এড়ানোর জন্য একটি স্পষ্ট ফাঁকা ডিরেক্টরি ডিরেক্টরি পরীক্ষা করা প্রয়োজন: ./*.mpg: বাস্তবে যখন এইরকম কোনও পরীক্ষার প্রয়োজন হয় না তখন এ জাতীয় ফাইল বা ডিরেক্টরি নেই।



1

অলিবরের উত্তর থেকে একটি ইঙ্গিত (বা বেশ কয়েকটি) নেওয়া, আমি বাশ ফাংশনটি পছন্দ করি:

function isEmptyDir {
  [ -d $1 -a -n "$( find $1 -prune -empty 2>/dev/null )" ]
}

কারণ এটি একটি সাবশেল তৈরি করার সময় এটি কোনও ও (1) সমাধানের কাছাকাছি হিসাবে আমি কল্পনা করতে পারি এবং এটির নাম দেওয়া এটি পাঠ্যযোগ্য করে তোলে। আমি তখন লিখতে পারি

if isEmptyDir somedir
then
  echo somedir is an empty directory
else
  echo somedir does not exist, is not a dir, is unreadable, or is  not empty
fi

ও (১) এর ক্ষেত্রে বহিরাগত ক্ষেত্রে রয়েছে: যদি কোনও বৃহত ডিরেক্টরিতে সর্বশেষ বা সমস্ত এন্ট্রি মুছে ফেলা হয় তবে এটি খালি কিনা তা নির্ধারণ করার জন্য "সন্ধান করুন" পুরো জিনিসটি পড়তে হতে পারে। আমি বিশ্বাস করি যে প্রত্যাশিত পারফরম্যান্স হ'ল (1) তবে সবচেয়ে খারাপ ক্ষেত্রে ডিরেক্টরি আকারে লিনিয়ার। আমি এটি পরিমাপ করিনি।


0

এখনও অবধি আমি এমন কোনও উত্তর দেখিনি যা গ্রেপ ব্যবহার করে যা আমি মনে করি যা একটি সহজ উত্তর দেবে (খুব বেশি অদ্ভুত চিহ্ন সহ!)। বোর্ন শেল ব্যবহার করে ডিরেক্টরিতে কোনও ফাইল উপস্থিত রয়েছে কিনা তা আমি এখানে যাচ্ছি:

এটি একটি ডিরেক্টরি ফাইলের সংখ্যা প্রদান করে:

ls -l <directory> | egrep -c "^-"

ডিরেক্টরি যেখানে লেখা আছে সেখানে আপনি সেই ডিরেক্টরিটি পূরণ করতে পারেন। পাইপের প্রথম অর্ধেকটি প্রতিটি ফাইলের আউটপুট "-" প্রথম অক্ষর নিশ্চিত করে। egrep তারপরে নিয়মিত অভিব্যক্তি ব্যবহার করে সেই চিহ্নের সাথে শুরু হওয়া লাইনের সংখ্যা গণনা করে। এখন আপনাকে যা করতে হবে তা হ'ল ব্যাককোটিস ব্যবহার করে আপনি যে নম্বরটি পেয়েছেন তা সংরক্ষণ করুন এবং তুলনা করুন:

 #!/bin/sh 
 fileNum=`ls -l <directory> | egrep -c "^-"`  
 if [ $fileNum == x ] 
 then  
 #do what you want to do
 fi

এক্স আপনার পছন্দসই একটি পরিবর্তনশীল।


0

ছাঁটাই জিনিস এবং শেষ উত্তর মিশ্রণ, আমি পেয়েছিলাম

find "$some_dir" -prune -empty -type d | read && echo empty || echo "not empty"

এটি স্পেস সহ পাথের জন্যও কাজ করে



0

আমি যেতে চাই find:

if [ -z "$(find $dir -maxdepth 1 -type f)" ]; then
    echo "$dir has NO files"
else
    echo "$dir has files"

এটি সাব-ডিরেক্টরিতে না গিয়ে ডিরেক্টরিতে কেবল ফাইলগুলি অনুসন্ধানের আউটপুট পরীক্ষা করে। তারপরে এটি -zথেকে নেওয়া বিকল্পটি ব্যবহার করে আউটপুট পরীক্ষা করে man test:

   -z STRING
          the length of STRING is zero

কিছু ফলাফল দেখুন:

$ mkdir aaa
$ dir="aaa"

খালি দির:

$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

এটিতে কেবল ডায়ার করুন:

$ mkdir aaa/bbb
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

ডিরেক্টরিতে একটি ফাইল:

$ touch aaa/myfile
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
$ rm aaa/myfile 

একটি উপ-ডিরেক্টরিতে একটি ফাইল:

$ touch aaa/bbb/another_file
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

0

কিছু কাজের সাথে আমি কোনও ডিরেক্টরিতে ফাইল আছে কিনা তা জানার একটি সহজ উপায় খুঁজে পেতে পারি। বিশেষত .xML বা .txt ফাইল ইত্যাদি পরীক্ষা করতে গ্রেপ কমান্ডের সাহায্যে এটি আরও প্রসারিত হতে পারে প্রাক্তন:ls /some/dir | grep xml | wc -l | grep -w "0"

#!/bin/bash
if ([ $(ls /some/dir | wc -l  | grep -w "0") ])
    then
        echo 'No files'
    else
        echo 'Found files'
fi

-1
if ls /some/dir/* >/dev/null 2>&1 ; then echo "huzzah"; fi;

কমান্ডটি সাজাতে কোনও উদ্ধৃতি বা বন্ধনী নেই বলে আমি এটি পছন্দ করি।
ডেভ ওয়েব

আপনি যদি সেট করে থাকেন nullglobতবে এটি ব্যবহার না করার বিষয়ে সাবধানতা অবলম্বন করুন , কারণ তখন lsআদেশটি সফল হবে succeed
স্টিভ কেহলেট

ডিরেক্টরিতে ডট ফাইল রয়েছে এমন ক্ষেত্রে সমস্ত পরিবেশে কাজ করবে না।
দিয়েগো অগস্টো মোলিনা

-1

একটি নির্দিষ্ট লক্ষ্য ডিরেক্টরি পরীক্ষা করতে

if [ -d $target_dir ]; then
    ls_contents=$(ls -1 $target_dir | xargs); 
    if [ ! -z "$ls_contents" -a "$ls_contents" != "" ]; then
        echo "is not empty";
    else
        echo "is empty";
    fi;
else
    echo "directory does not exist";
fi;

-1

কমান্ড ফাইন্ড দিয়ে চেষ্টা করুন। হার্ডকোডযুক্ত ডিরেক্টরিটি বা যুক্তি হিসাবে উল্লেখ করুন। তারপরে ডিরেক্টরিতে থাকা সমস্ত ফাইল অনুসন্ধান করার জন্য অনুসন্ধান শুরু করুন। অনুসন্ধানের ফিরতি শূন্য কিনা তা পরীক্ষা করে দেখুন। অনুসন্ধানের ডেটা প্রতিধ্বনি করুন

#!/bin/bash

_DIR="/home/user/test/"
#_DIR=$1
_FIND=$(find $_DIR -type f )
if [ -n "$_FIND" ]
then
   echo -e "$_DIR contains files or subdirs with files \n\n "
   echo "$_FIND"
else
echo "empty (or does not exist)"
fi

ডিরেক্টরিতে যদি খালি ডিরেক্টরি থাকে বা অ-নিয়মিত ফাইল থাকে (সকেট, চর ডিভাইস, সিমলিংক ইত্যাদি) এটি কাজ করবে না। ডিরেক্টরিটি খালি বলে জানানো হবে।
দিয়েগো অগস্টো মোলিনা

@ ডিগোআউগস্টোমোলিনা যদি প্রশ্নটিতে আমি সঠিকভাবে বুঝতে পারি তবে তা হ'ল আমরা যাচাই করে দেখছি যে ফাইলগুলি রয়েছে (আক্ষরিকরূপে ফাইল হিসাবে) কারণ-তর্কটি ব্যবহার করার কারণ রয়েছে। তবে আপনার মন্তব্যগুলি এখনও সত্য।
igiannak

-2

ls - Aপোস্ট করা সমাধানগুলি আমি পছন্দ করি না । সম্ভবত ডিরেক্টরিটি খালি থাকলে আপনি এটি পরীক্ষা করতে চান কারণ আপনি এটি মুছতে চান না। নিম্নলিখিতটি তা করে। তবে আপনি যদি কেবল একটি খালি ফাইল লগইন করতে চান, অবশ্যই মুছে ফেলা এবং পুনরুদ্ধার করা তত দ্রুত হয় সম্ভবত অসীম ফাইলগুলির তালিকা তৈরি করা?

এই কাজ করা উচিত...

if !  rmdir ${target}
then
    echo "not empty"
else
    echo "empty"
    mkdir ${target}
fi

4
ব্যবহারকারীর লেখার অনুমতি না থাকলে এটি কাজ করে না ${target}/..
জেনস

একটি পরীক্ষা ধ্বংসাত্মক করা ঠিক একটি খারাপ ধারণা। অন্যান্য বিষয়গুলির মধ্যে এটি জাতি শর্তগুলির পরিচয় দেয়।
4dummy

-2

এটি আমার জন্য ভাল কাজ করে (যখন দির উপস্থিত থাকে):

some_dir="/some/dir with whitespace & other characters/"
if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

সম্পূর্ণ চেক সহ:

if [ -d "$some_dir" ]; then
  if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; else "Dir is NOT empty" fi
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.