বাশ শেল স্ক্রিপ্টে ডিরেক্টরি বিদ্যমান কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


3718

বাশ শেল স্ক্রিপ্টের মধ্যে ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে কোন কমান্ড ব্যবহার করা যেতে পারে?

উত্তর:


5144

কোনও শেল স্ক্রিপ্টে ডিরেক্টরি রয়েছে কিনা তা পরীক্ষা করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

বা ডিরেক্টরি নেই কিনা তা পরীক্ষা করতে:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

যাইহোক, জন এরিকসন যেমন উল্লেখ করেছেন, পরবর্তী কমান্ডগুলি লক্ষ্য হিসাবে কাজ করতে পারে না যদি আপনি বিবেচনায় না নেন যে কোনও ডিরেক্টরিতে একটি প্রতীকী লিঙ্কও এই চেকটি পাস করবে। যেমন এটি চলছে:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

ত্রুটি বার্তা উত্পন্ন করবে:

rmdir: failed to remove `symlink': Not a directory

সুতরাং পরবর্তী নির্দেশগুলি যদি ডিরেক্টরি আশা করে তবে প্রতীকী লিঙ্কগুলি আলাদাভাবে আচরণ করতে হবে:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

ভেরিয়েবলগুলি মোড়ানোর জন্য ব্যবহৃত ডাবল-কোটের বিশেষ নোটটি নিন। এর কারণটি 8 জিয়ন অন্য একটি উত্তরে ব্যাখ্যা করেছেন ।

যদি ভেরিয়েবলগুলিতে স্পেস বা অন্যান্য অস্বাভাবিক অক্ষর থাকে তবে এটি সম্ভবত স্ক্রিপ্টটি ব্যর্থ হতে পারে।


29
আপনি যদি এটি জিএনইউ সরঞ্জামগুলির সাথে সুরক্ষিতভাবে খেলতে চান তবে ব্যবহারের --প্রস্তাব দেওয়া হয় (বিকল্পগুলির শেষের দিকে)। অন্যথায়, যদি আপনার চলকটিতে কোনও বিকল্পের মতো দেখতে এমন কিছু থাকে তবে স্ক্রিপ্টটি ফাঁকা জায়গাগুলির মতোই ব্যর্থ হবে।
মার্ক মুটজ - মিমুতজ

2
বাশ,
কাশ

79
একটি জিনিস মনে রাখতে হবে: [ ! -d "$DIRECTORY" ]তা যদি সত্য হয় তবে $DIRECTORYতা যদি না থাকে তবে বা যদি তা না থাকে তবে ডিরেক্টরি নয়। এর মতো কিছু বিবেচনা করুন if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; "$DIRECTORY"কোনও ফাইল হলে এটি ব্যর্থ হবে । (অবশ্যই আপনার mkdirযাইহোক যাইহোক সফল হয়েছে কিনা তা পরীক্ষা করা উচিত ; এটি ব্যর্থ হতে পারে তার বেশ কয়েকটি কারণ রয়েছে))
কিথ থম্পসন

5
এটি উল্লেখযোগ্য হতে পারে যে চেকটি সম্পাদন করা মাত্রই অন্যান্য প্রক্রিয়াগুলির কারণে পরিস্থিতি ইতিমধ্যে পরিবর্তিত হতে পারে। অনেক ক্ষেত্রে কেবল ডিরেক্টরি তৈরি বা ব্যবহার করা ভাল এবং ব্যর্থতার বিষয়ে প্রতিক্রিয়া জানানো ভাল।
আলফ

12
ডিরেক্টরি ( -d) এবং সিমলিংক ( -L) উভয়ের জন্য পরীক্ষা করার পরিবর্তে ভেরিয়েবলের মতো স্ল্যাশ যুক্ত করা সহজ if [ -d "${THING:+$THING/}" ]। একটি ডিরেক্টরি অতিরিক্ত স্ল্যাশ মনে করবে না। একটি ফাইল মিথ্যাতে মূল্যায়ন করবে। খালি ফাঁকা থাকবে, তাই মিথ্যা। এবং একটি সিমিলিংক এর গন্তব্যে সমাধান করা হবে। অবশ্যই এটি আপনার লক্ষ্যের উপর নির্ভর করে। আপনি যদি সেখানে যেতে চান তবে এটি ঠিক আছে। আপনি যদি এটি মুছতে চান তবে এই উত্তরের কোডটি আরও ভাল।
ঘোটি

530

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

একদিন, সেই বাচ্চাদের মধ্যে একটি আপনার $DIRECTORYসেটটি সেট করে স্ক্রিপ্টটি চালাবে এবং আপনার স্ক্রিপ্টটি ফুরিয়ে "My M0viez"যাবে। আপনি এটা চান না। সুতরাং এটি ব্যবহার করুন।

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

9
ডাবল উদ্ধৃতি ব্যবহারের আর একটি কারণ হ'ল some DIRECTORY কোনও কারণে সেট করা হয়নি।
জন এরিকসন

2
"সর্বদা ডাবল উদ্ধৃতিতে ভেরিয়েবলগুলি ব্যাপ করুন ... ব্যাশ স্ক্রিপ্টে।" ব্যাশের জন্য, [[...]] ব্যবহার করার সময় প্রযুক্তিগতভাবে প্রয়োজনীয় নয়; দেখতে tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (দ্রষ্টব্য: কোন শব্দ বিভাজন): "কোন ফাইলের নাম সম্প্রসারণ বা ওয়ার্ড বিভাজন [[এবং]] মধ্যে সঞ্চালিত হয়, কিন্তু সেখানে প্যারামিটার বিস্তার এবং কমান্ড প্রতিকল্পন হয়।"
মাইকেল

2
ইউনিক্স / লিনাক্সের ডিরেক্টরিগুলির কোনও সাদা স্থান থাকতে হবে না এবং পরবর্তীকালে স্ক্রিপ্টগুলি এতে মানিয়ে নেওয়া উচিত নয়। এটি উইন্ডোজ স্ক্রিপ্টিংয়ের সমস্ত পরিণতি সহ উইন্ডোজ সমর্থন করে তবে এটি অপ্রয়োজনীয় প্রয়োজনীয়তা প্রবর্তন করার প্রয়োজন নেই, দয়া করে যাই হোক না কেন তার ভালবাসার জন্য দয়া করে।
TVCa

18
@tvCa আমি দেখতে পেয়েছি যে ব্যবহারকারীরা সাধারণত তাদের ডিরেক্টরি নামগুলিতে বিকাশকারীদের জন্য জিনিসগুলি আরও সহজ করার জন্য বাধ্য হওয়ার চেয়ে আরও নমনীয়তার অনুমতি দেওয়া পছন্দ করেন। (প্রকৃতপক্ষে, দীর্ঘ ফাইলের নাম নিয়ে কাজ করার সময়, আমি ফাঁকা জায়গাগুলি ব্যথার মতোই মনে করি যা শব্দ মোড়কে মেরে ফেলে যদিও আমি নিজে অতীতেও স্ক্রিপ্ট এবং প্রোগ্রামগুলিতে ফাঁকা জায়গাগুলির সাথে অ্যাকাউন্ট না দেওয়ার জন্য ভোগ করেছি।)
জ্যাব

2
হা। স্পেসগুলি কেবল এমন অক্ষর যা সাধারণত কোনও গ্লাইফ থাকে না। যাইহোক, আপনি একটি ব্যাকস্ল্যাশ দিয়ে এড়াতে পারেন।
উছুগাকা

228

নোট- ডি পরীক্ষাটি কিছু আশ্চর্যজনক ফলাফল আনতে পারে:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

অধীন ফাইল: "ডিরেক্টরি কখন ডিরেক্টরি হয় না?" উত্তর: "এটি যখন কোনও ডিরেক্টরিতে একটি সিমিলিংক হয়।" কিছুটা আরও পুঙ্খানুপুঙ্খ পরীক্ষা:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

আপনি বাশ শর্তসাপেক্ষ এক্সপ্রেশন এবং বিল্টিন [কমান্ড এবং [[যৌগিক কম্যান্ডে বাশ ম্যানুয়ালটিতে আরও তথ্য পেতে পারেন ।


12
বা, ধরে নেওয়া কেবল ডিরেক্টরিতে কাজ করা প্রয়োজন (এবং লিঙ্কগুলি উপেক্ষা করা যেতে পারে) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... বা, এমন একটি আদেশের জন্য যা লিঙ্ক ও ডায়ার উভয় ক্ষেত্রেই কাজ করে:rm -r tmpdir
মাইকেল

218

যুক্তি পরীক্ষার লিখনকে আরও প্রাকৃতিক করে তোলে এর ডাবল-বন্ধনী সংস্করণটি আমি খুঁজে পাই test:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

কারণ if [[ -d "$TARFILE" ]]আমি পাচ্ছি [[: পাওয়া যায়নি
TheVillageIdiot

15
@TheVillageIdiot এবং @ Hedgehog, আপনি কি ব্যাশ শেল ব্যবহার করছেন? ডাবল বন্ধনী সর্বজনীনভাবে সমর্থিত নয়। : এখানে যে বিন্দু একটি এইরকম উত্তর দেন এর stackoverflow.com/questions/669452/...
yukondude

6
এবং ব্যাসিবক্সে ছাই ডিফল্ট সংকলন বিকল্পগুলি [[ ]]সমর্থন করে তবে বাস্তবে এতে কোনও আলাদা কার্যকারিতা সরবরাহ করে না [ ]। যদি বহনযোগ্যতা কোনও উদ্বেগের বিষয় থাকে [ ]তবে প্রয়োজনীয় workaround সাথে আটকে থাকুন এবং ব্যবহার করুন।
সন্দেহজনক জিম 31'12

6
একটি শেল স্ক্রিপ্ট-এ ব্যাশ নির্মান ব্যবহার করা হয় তবে ..., স্ক্রিপ্ট প্রথম লাইন হওয়া উচিত: # / বিন / ব্যাশ (এবং # / বিন / SH, ksh, ইত্যাদি!)!
মাইকেল

ব্যাশে ডাবল বর্গাকার বন্ধনী ব্যবহার করার সময়, আপনাকে ভেরিয়েবলগুলি উদ্ধৃত করার প্রয়োজন হবে না।
হুবার্ট গ্রেজস্কোইয়াক

157

খাটো ফর্ম:

[ -d "$DIR" ] && echo "Yes"

6
ভালো কাজ করে: if $dir is a dir, then echo "yes"? কিছুটা ব্যাখ্যা সাহায্য করবে :)
মার্টিজন

5
cmd && otherএটি একটি সাধারণ শর্টহ্যান্ড if cmd; then other; fi- এটি বেশিরভাগ প্রোগ্রামিং ভাষার সাথে কাজ করে যা বুলিয়ান যুক্তি সমর্থন করে এবং শর্ট সার্কিট মূল্যায়ন হিসাবে পরিচিত ।
ট্রিপলি

1
আচরণটি এর অধীনে এক নয় set -e(যা শেল প্রোগ্রামিংয়ের সেরা অনুশীলন )।
ডলম্যান

1
@ ডলম্যান দ্য [ -d "$DIR" ]চেক করা হয়েছে (তারপরে && echo Yes), তাই আমার বিশ্বাস set -eস্ক্রিপ্ট আচরণের ক্ষেত্রে কোনও তফাত আসে না (উদাহরণস্বরূপ যদি পরীক্ষা ব্যর্থ হয় তবে স্ক্রিপ্টটি স্বাভাবিকভাবে চলতে থাকে)।
tzot

132

ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে আপনি ifএই জাতীয় কোনও সাধারণ কাঠামো ব্যবহার করতে পারেন :

if [ -d directory/path to a directory ] ; then
# Things to do

else #if needed #also: elif [new condition]
# Things to do
fi

আপনি এটি নেতিবাচক ক্ষেত্রেও করতে পারেন:

if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory

দ্রষ্টব্য : সাবধান। উভয়দিকে খোলার এবং বন্ধ বন্ধনীগুলির খালি স্থান ছেড়ে দিন।

একই বাক্য গঠন সহ আপনি ব্যবহার করতে পারেন:

-e: any kind of archive

-f: file

-h: symbolic link

-r: readable file

-w: writable file

-x: executable file

-s: file size greater than zero

এটি ফাইল স্যুইচগুলির সাথে অফ-টপিক বাদ দিয়ে ২০০৮ সালের গৃহীত উত্তরের চেয়ে কীভাবে ভাল?
ড্যান ড্যাসকলেসকু 13

ভাল, কারণ [! -d ডিরেক্টরি / ডিরেক্টরিতে পথ]
ব্যবহারকারীর 1855805

108
  1. ডিরেক্টরি বা ফাইল উপস্থিত কিনা তা পরীক্ষা করার জন্য একটি সাধারণ স্ক্রিপ্ট:

    if [ -d /home/ram/dir ]   # For file "if [-f /home/rama/file]"
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
  2. ডিরেক্টরি উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য একটি সাধারণ স্ক্রিপ্ট:

    mkdir tempdir   # If you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi

    উপরের স্ক্রিপ্টগুলি ডিরেক্টরি উপস্থিত আছে কিনা তা যাচাই করবে

    $? শেষ কমান্ডটি যদি সাফল্য হয় তবে এটি "0" প্রদান করে, অন্যথায় একটি শূন্যের মান। ধরুন tempdirইতিমধ্যে উপস্থিত আছেন। তারপরে mkdir tempdirনীচের মতো একটি ত্রুটি দেবে:

    mkdir: ডিরেক্টরি 'tempdir' তৈরি করতে পারে না: ফাইল বিদ্যমান


4
দ্বিতীয়টি ডিরেক্টরিটি তৈরি করবে, যদি এটি প্রথমে উপস্থিত না থাকে। তাহলে এটি আদর্শবান নয়।
শিহে ঝাং

👆👆👆। দ্বিতীয়টি বিপজ্জনক বলে মনে হচ্ছে। যেহেতু এটি ডিরেক্টরিটি তৈরি করে, এটি এমনকি সত্য নয় যে দির উপস্থিত নেই।
ক্রিস

92

আপনি ব্যবহার করতে পারেন test -d(দেখুন man test)।

-d file যদি ফাইল বিদ্যমান থাকে এবং ডিরেক্টরি হয় তবে এটি সত্য।

উদাহরণ স্বরূপ:

test -d "/etc" && echo Exists || echo Does not exist

দ্রষ্টব্য: testকমান্ডটি শর্তসাপেক্ষ অভিব্যক্তির সমান [(দেখুন man [:), সুতরাং এটি শেল স্ক্রিপ্টগুলিতে পোর্টেবল।

[- এটি testবিল্টিনের প্রতিশব্দ , তবে শেষ যুক্তিটি অবশ্যই শাব্দিক হওয়া উচিত, ]খোলার সাথে মেলে [

সম্ভাব্য বিকল্প বা আরও সহায়তার জন্য, চেক করুন:

  • help [
  • help test
  • man test অথবা man [

55

বা সম্পূর্ণ অকেজো কিছু জন্য:

[ -d . ] || echo "No"

6
এটি কখনই "না" মুদ্রণ করবে না। বর্তমান ডিরেক্টরিটি সর্বদা উপস্থিত থাকে, যদি না অন্য থ্রেড বা অন্য উপায়ে মুছে ফেলা হয়।
জাহিদ

নিখুঁত নমুনা: প্রদত্ত উত্তরের তুলনায় কীভাবে "অনন্য" কিছু উত্তর রয়েছে তা প্রদত্ত
সের্গে সার্গসায়ান

4
কেন এতবার উপবিষ্টিত হয়েছে? এটি প্রশ্নের উত্তর দেয় না।
কোডফোরস্টার

এটি সেরা উত্তর ইভা হিসাবে নিন
কার্ল মরিসন

52

এখানে একটি খুব বাস্তববাদী প্রতিমা আছে:

(cd $dir) || return # Is this a directory,
                    # and do we have access?

আমি সাধারণত একটি ফাংশন এ এটি মোড়ানো:

can_use_as_dir() {
    (cd ${1:?pathname expected}) || return
}

বা:

assert_dir_access() {
    (cd ${1:?pathname expected}) || exit
}

এই পদ্ধতির সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আমাকে কোনও ভাল ত্রুটির বার্তাটি ভাবার দরকার নেই।

cdইতিমধ্যে স্ট্যান্ডার্ড ত্রুটির জন্য আমাকে একটি স্ট্যান্ডার্ড এক লাইন বার্তা দেবে । আমি সরবরাহ করতে সক্ষম হতে এটি আরও তথ্য দেবে। cdসাবসেলের অভ্যন্তর সম্পাদন করে ( ... ), কমান্ড কলারের বর্তমান ডিরেক্টরিকে প্রভাবিত করে না। ডিরেক্টরি উপস্থিত থাকলে, এই সাবশেল এবং ফাংশনটি কেবল কোনও অপ-অপশন।

পরবর্তী যুক্তি যে আমরা পাস হয় cd: ${1:?pathname expected}। এটি প্যারামিটার প্রতিস্থাপনের আরও বিস্তৃত রূপ যা নীচে আরও বিশদে ব্যাখ্যা করা হয়েছে।

Tl; dr: যদি এই ফাংশনটিতে প্রবেশ করা স্ট্রিংটি খালি থাকে তবে আমরা আবার সাব-শেল থেকে প্রস্থান করব ( ... )এবং প্রদত্ত ত্রুটি বার্তায় ফাংশন থেকে ফিরে আসছি ।


ksh93ম্যান পৃষ্ঠা থেকে উদ্ধৃতি :

${parameter:?word}

যদি parameter সেট করা থাকে এবং অ-শূন্য হয় তবে এর মানটি বিকল্পযুক্ত করুন; অন্যথায়, wordশেল থেকে মুদ্রণ এবং প্রস্থান করুন (ইন্টারেক্টিভ না হলে)। যদি wordবাদ দেওয়া হয় তবে একটি মানক বার্তা প্রিন্ট করা হয়।

এবং

যদি :উপরের এক্সপ্রেশনগুলি থেকে কোলন বাদ দেওয়া হয় তবে শেলটি কেবলমাত্র পরামিতি সেট করা আছে কিনা তা পরীক্ষা করে।

এখানে ফ্রেসিং শেল ডকুমেন্টেশনের কাছে অদ্ভুত word, যেমনটি হোয়াইটস্পেস সহ কোনও যুক্তিসঙ্গত স্ট্রিংকে বোঝায়।

এই বিশেষ ক্ষেত্রে, আমি জানি যে স্ট্যান্ডার্ড ত্রুটি বার্তাটি 1: parameter not setপর্যাপ্ত নয়, তাই আমরা এখানে যে ধরণের মান আশা করি সেটিকে জুম করব - pathnameডিরেক্টরিটি।

একটি দার্শনিক নোট:

শেলটি কোনও অবজেক্ট ওরিয়েন্টেড ভাষা নয়, তাই বার্তাটি বলে pathname, না directory। এই স্তরে, আমি বরং এটি সহজ রাখব - কোনও ফাংশনের যুক্তি কেবল স্ট্রিং।


এটি কেবল অস্তিত্বের জন্য যাচাই করা ছাড়াও আরও বেশি কিছু করে: আপনার ব্যবহারকারীর পর্যায়ে অ্যাক্সেসযোগ্যতার জন্য এই চেক। কেবলমাত্র অস্তিত্বের জন্য তাই প্রশ্ন । test -d@ গ্রুন্ডলেফ্লেক ব্যাখ্যা করেছেন ঠিক তাই সঠিক উত্তর answer
এফ। হাউরি

7
@ এফ.হৌরি - তিনি আর কিছু চাইতেন না, এটি সত্য। তবে, আমি খুঁজে পেয়েছি যে আমার সাধারণত এর চেয়ে আরও বেশি কিছু জানতে হবে।
হেন্ক ল্যাঙ্গভেল্ড

এবং এটি আমার কাছে কখনও ঘটেনি যে কোনও পরীক্ষাই চূড়ান্ত হতে পারে না, যদি না এটি মূল হিসাবে চালিত হয়। test -d /unreadable/existsতর্ক থাকলেও ব্যর্থ হবে।
হেন্ক ল্যাঙ্গভেল্ড

36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

ডিরেক্টরি বিদ্যমান কিনা তা উপরের কোডটি পরীক্ষা করে এবং এটি লিখনযোগ্য কিনা।


1
-a এর সাথে কার্যকর হয়। এটি "অবচয় করা হয়েছে" এবং এর ব্যবহারকে নিরুৎসাহিত করা হয়েছে।
মামাতো ভাই কোকেন

27
DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

অনলাইন চেষ্টা করুন


স্মরণকারীর spaceপরে [-> [`` -d । জায়গা হারিয়ে যাওয়ার কারণে আমি ত্রুটি পেয়েছি
রাজ

4
আবার , আরও কার্যকর ব্যাখ্যা সহ এই উত্তরটি ইতিমধ্যে ২০০৮ সালে দেওয়া হয়েছিল। এখানে শুধুমাত্র নতুন জিনিসটি হ'ল অনলাইন খেলার মাঠ।
ড্যান ড্যাসক্লেস্কু


21

আরও বৈশিষ্ট্য ব্যবহার করে find

  • সাব-ডিরেক্টরিগুলির মধ্যে ফোল্ডারের অস্তিত্ব পরীক্ষা করুন:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
  • বর্তমান ডিরেক্টরিতে একটি প্যাটার্নের ভিত্তিতে এক বা একাধিক ফোল্ডারের অস্তিত্ব পরীক্ষা করুন:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
  • উভয় সংমিশ্রণ। নিম্নলিখিত উদাহরণে এটি বর্তমান ডিরেক্টরিতে ফোল্ডারের অস্তিত্ব পরীক্ষা করে:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi

হাই নিল আপনার ধারণাটি যেমন: একটি প্যাটার্নের উপর নির্ভর করে ডিরেক্টরিগুলির অস্তিত্ব পরীক্ষা করতে দরকারী হতে পারে find -maxdepth 1 -type d -name 'pattern'। আমি আপনার উত্তরে এই কৌশলটি সংযোজন করলাম তাতে কি আপত্তি আছে? চিয়ার্স;)
ওলিব্রে

20

আসলে, বুলেটপ্রুফ পদ্ধতির জন্য আপনার বেশ কয়েকটি সরঞ্জাম ব্যবহার করা উচিত:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
    echo "It's a dir";
fi

যতক্ষণ আপনি ব্যবহার করেন ততক্ষণ স্পেস এবং বিশেষ অক্ষর সম্পর্কে চিন্তার কোনও দরকার নেই "${}"

মনে রাখবেন যে [[]]এটি পোর্টেবল হিসাবে ততটা নয় [], তবে যেহেতু বেশিরভাগ লোক ব্যাশের আধুনিক সংস্করণগুলি নিয়ে কাজ করে (সর্বোপরি, বেশিরভাগ লোক এমনকি কমান্ড লাইন :-p দিয়েও কাজ করে না), লাভটি ঝামেলার চেয়ে বেশি।


17

আপনি কি ifলাফানোর আগে দেখার চেয়ে বরং যা কিছু করতে চান তা করার কথা বিবেচনা করেছেন ?

উদাহরণস্বরূপ, আপনি যদি কোনও ডিরেক্টরি প্রবেশের আগে আপনি যদি অস্তিত্ব পরীক্ষা করতে চান তবে কেবল এটি করার চেষ্টা করুন:

if pushd /path/you/want/to/enter; then
    # Commands you want to run in this directory
    popd
fi

আপনি যে পথটি দিয়েছেন তা যদি pushdবিদ্যমান থাকে তবে আপনি এটি প্রবেশ করবেন এবং এটি দিয়ে প্রস্থান হবে 0, যার অর্থ thenবিবৃতিটির অংশটি কার্যকর হবে। যদি এটি বিদ্যমান না থাকে তবে কিছুই হবে না (কিছু আউটপুট বলার বাইরে ডিরেক্টরিটি বিদ্যমান নেই, এটি সম্ভবত ডিবাগিংয়ের জন্য সহায়ক পার্শ্ব-প্রতিক্রিয়া is

এটি এর চেয়ে ভাল বলে মনে হচ্ছে, যার জন্য নিজেকে পুনরাবৃত্তি করা দরকার:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # Commands you want to run in this directory
    popd
fi

একই জিনিস সাথে কাজ করে cd, mv, rm, ইত্যাদি ... যদি আপনি তাদের ফাইল উপস্থিত না থাকার চেষ্টা, তারা একটি ত্রুটির কথা থেকে প্রস্থান করুন এবং বলার অপেক্ষা রাখে না এটি বিদ্যমান নেই একটি বার্তা প্রিন্ট করব, এবং আপনার thenব্লক এড়ানো হবে। যদি আপনি তাদের উপস্থিত ফাইলগুলিতে চেষ্টা করেন তবে কমান্ডটি কার্যকর হবে এবং একটি স্থিতি সহ প্রস্থান করবে 0, যা আপনার thenব্লককে সম্পাদন করতে দেয় ।


2
আমার পক্ষে এটি করা সবচেয়ে মার্জিত উপায় push আমি এটি একটি উত্তর হিসাবে পোস্ট করতে
চলেছি

15

একাধিক ডিরেক্টরি যাচাই করতে এই কোডটি ব্যবহার করুন:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

আপনি কিভাবে পরীক্ষা করতে পারেন যে এটি বিদ্যমান নেই?
পেরোহুন্টার

15

ডিরেক্টরিটি বিদ্যমান কিনা তা পরীক্ষা করুন, অন্যটি তৈরি করুন:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

16
আপনি mkdir -p "$DIRECTORY"একই প্রভাব জন্য ব্যবহার করতে পারেন ।
লোগান পিকআপ 21

15
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

এনবি: ভেরিয়েবলগুলি উদ্ধৃত করা একটি ভাল অনুশীলন।

ব্যাখ্যা:

  • -d: এটি ডিরেক্টরি কিনা তা পরীক্ষা করুন
  • -L: এটি একটি প্রতীকী লিঙ্ক কিনা তা পরীক্ষা করুন

একটি ব্যাখ্যা ক্রমযুক্ত হবে ( আপনার উত্তর সম্পাদনা করে , মন্তব্যগুলিতে এখানে নয়)।
পিটার মর্টেনসেন


11

এই উত্তরটি শেল স্ক্রিপ্ট হিসাবে মোড়ানো

উদাহরণ

$ is_dir ~                           
YES

$ is_dir /tmp                        
YES

$ is_dir ~/bin                       
YES

$ mkdir '/tmp/test me'

$ is_dir '/tmp/test me'
YES

$ is_dir /asdf/asdf                  
NO

# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
  echo "Folder doesnt exist: $DIR";
  exit;
fi

is_dir

function show_help()
{
  IT=$(CAT <<EOF

  usage: DIR
  output: YES or NO, depending on whether or not the directory exists.

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

DIR=$1
if [ -d $DIR ]; then 
   echo "YES";
   exit;
fi
echo "NO";

10

ব্যবহার -eচেক ফাইলের জন্য চেক করবে এবং এই ডিরেক্টরি অন্তর্ভুক্ত করা হয়েছে।

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

1
এবং ওপি-র প্রশ্নের সঠিক উত্তর দেয় না - এটি কোনও ডিরেক্টরি?
মার্ক স্টুয়ার্ট

8

অনুযায়ী জনাথন এর মন্তব্যে:

আপনি যদি ডিরেক্টরিটি তৈরি করতে চান এবং এটি এখনও বিদ্যমান নেই, তবে সহজ কৌশলটি হ'ল mkdir -pডিরেক্টরি তৈরি করে - এবং যে কোনও ডিরেক্টরি অনুপস্থিত রয়েছে - ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকলে ব্যর্থ হয় না, তাই আপনি এটি সব করতে পারেন সাথে একবারে:

mkdir -p /some/directory/you/want/to/exist || exit 1

7
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

এটি সম্পূর্ণরূপে সত্য নয়...

আপনি যদি সেই ডিরেক্টরিতে যেতে চান তবে আপনার ডিরেক্টরিতে মৃত্যুদন্ড কার্যকর করার অধিকারও থাকতে হবে। হয়তো আপনার লেখার অধিকারও থাকতে হবে।

অতএব:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

7

fileপ্রোগ্রামটি ব্যবহার করুন । সমস্ত ডিরেক্টরি ডিরেক্টরিতে লিনাক্সের ফাইল হিসাবে বিবেচনা করে নিম্নলিখিত কমান্ড প্রদান করা যথেষ্ট হবে:

file $directory_name

অস্তিত্বহীন ফাইল চেক করা হচ্ছে: file blah

আউটপুট: cannot open 'blah' (No such file or directory)

একটি বিদ্যমান ডিরেক্টরি পরীক্ষা করা হচ্ছে: file bluh

আউটপুট: bluh: directory


1
দুর্দান্ত ধারণা, তবে উভয় ক্ষেত্রেই খুব খারাপ ফাইল ফাইল কমান্ড সর্বদা 0 প্রস্থান কোড ফেরত দেয়। এছাড়াও কখন ফাইলটি / ডিরেক্টরি :( পাওয়া যাবে না।
danger89

6

lsসাথে কমান্ড -l(দীর্ঘ তালিকা) বিকল্প আয় ফাইল ও ডিরেক্টরিগুলি সম্পর্কে তথ্য বৈশিষ্ট্যাবলী।
বিশেষত ls -lআউটপুট প্রথম অক্ষর এটি সাধারণত একটি dবা একটি -(ড্যাশ) হয়। dএকটি তালিকাভুক্ত ক্ষেত্রে নিশ্চিতভাবে একটি ডিরেক্টরি হয়।

কেবলমাত্র একটি লাইনে নিম্নলিখিত কমান্ডটি আপনাকে জানাবে যে প্রদত্ত ISDIRভেরিয়েবলটি ডিরেক্টরিতে একটি পথ রয়েছে কিনা :

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

ব্যবহারিক ব্যবহার:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

+1, তবে এটি যখন ISDIR এর অস্তিত্ব থাকে না আপনি একটি ত্রুটি বার্তা পাশাপাশি আপনার ডায়াগোনস্টিক্স বার্তা পান।
ysap


5

আপনি যদি ডিরেক্টরিটি সত্যিকারের ডিরেক্টরি বা সিমলিংক নির্বিশেষে কোনও ডিরেক্টরি উপস্থিত কিনা তা পরীক্ষা করতে চান তবে এটি ব্যবহার করুন:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

ব্যাখ্যা: "ls" কমান্ডটি একটি ত্রুটি দেয় "ls: / x: ডিরেক্টরি বা সিমিলিংকের উপস্থিত না থাকলে এই জাতীয় কোনও ফাইল বা ডিরেক্টরি" নেই এবং আপনি "$?" এর মাধ্যমে পুনরুদ্ধার করতে পারেন এমন কোডটিও সেট করে যা অ " -নুল (সাধারণত "1")। নিশ্চিত হয়ে নিন যে আপনি "এলএস" কল করার পরে রিটার্ন কোডটি সরাসরি পরীক্ষা করেছেন।


3
বিকল্পভাবে আপনি এই সংক্ষিপ্ত সংস্করণটি ব্যবহার করতে পারেন:if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk

5

(1)

[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"

(2)

[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"

(3)

[[ -d run_dir  && ! -L run_dir ]] && echo Exists || echo "Not Exists"

উপরের সরবরাহিত পদ্ধতির একটিতে যদি কোনও সমস্যা পাওয়া যায়:

সঙ্গে lsকমান্ড; ক্ষেত্রে যখন ডিরেক্টরি উপস্থিত না থাকে - একটি ত্রুটি বার্তা প্রদর্শিত হয়

[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists

-ksh: not: not found [এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই]


"উপরে" কী বোঝায়? এই উত্তর বা পূর্বের উত্তরগুলিতে তিনটি কমান্ড লাইন? (দয়া করে আপনার উত্তর সম্পাদনা করে প্রতিক্রিয়া জানান , এখানে মন্তব্য নয় advance আগাম ধন্যবাদ))
পিটার মর্টেনসেন

4

এখানে দুর্দান্ত সমাধান রয়েছে, তবে শেষ পর্যন্ত প্রতিটি স্ক্রিপ্ট ব্যর্থ হবে যদি আপনি সঠিক ডিরেক্টরিতে না থাকেন। সুতরাং কোড এর মত:

if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here
    rm "$LINK_OR_DIR"
else
    # It's a directory!
    # Directory command goes here
    rmdir "$LINK_OR_DIR"
fi
fi

কার্যকরভাবে কার্যকর করা হবে কেবলমাত্র মৃত্যুদণ্ডের মুহুর্তে আপনি যদি কোনও ডিরেক্টরিতে থাকেন যা আপনার একটি সাব-ডিরেক্টরি আছে যা আপনি যাচাই করে যাচ্ছেন।

আমি এর মতো প্রাথমিক প্রশ্নটি বুঝতে পারি: ফাইল সিস্টেমে ব্যবহারকারীর অবস্থান নির্বিশেষে কোনও ডিরেক্টরি উপস্থিত রয়েছে কিনা তা যাচাই করতে to সুতরাং 'ফাইন্ড' কমান্ডটি ব্যবহার করা কৌশলটি করতে পারে:

dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d

এই সমাধানটি ভাল কারণ এটি ফাইল / ডিরেক্টরি অনুসন্ধানের সময় ওয়াইল্ডকার্ডগুলির একটি দরকারী বৈশিষ্ট্য ব্যবহার করার অনুমতি দেয়। একমাত্র সমস্যাটি হ'ল, যদি অনুসন্ধান ডিরেক্টরিটি বিদ্যমান না থাকে তবে 'ফাইন্ড' কমান্ডটি স্ট্যান্ডার্ড আউটপুটে (আমার স্বাদের জন্য মার্জিত সমাধান নয়) মুদ্রণ করবে এবং তবুও শূন্য প্রস্থান থাকবে। সম্ভবত কেউ এই উন্নতি করতে পারে।


13
যদি কোনও প্রোগ্রাম আমার বর্তমান হার্ড ওয়ার্কিং ডিরেক্টরিটি সুনির্দিষ্টভাবে অনুসন্ধান করার পরিবর্তে বা আমার দেওয়া নিখুঁত পথটি ব্যবহার করার পরিবর্তে কোনও ডিরেক্টরি অনুসন্ধান করার জন্য আমার পুরো হার্ড ড্রাইভটি অনুসন্ধান করে তবে আমি ক্ষুব্ধ হব। আপনি যা প্রস্তাব করেছেন সেটি কোনও নামের locateজন্য ভাল তবে অন্য কোনও কিছুর জন্য ভাল নয় ...
স্যারনল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.