shell - একটি শেল স্ক্রিপ্টে একটি ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করুন




unix posix (20)

শেল স্ক্রিপ্টের মধ্যে একটি ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করার জন্য কোন কমান্ড ব্যবহার করা যেতে পারে?


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
    

  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
    

    উপরের স্ক্রিপ্ট dir বর্তমান বা না চেক করবে

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

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


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

[ -d . ] || echo "No"

আপনি if আপনি লাফ আগে খুঁজছেন চেয়ে বরং if আপনি করতে চান যাই হোক না কেন?

IE, যদি আপনি এটি প্রবেশ করার আগে ডিরেক্টরিটির অস্তিত্ব পরীক্ষা করতে চান তবে এটি করার চেষ্টা করুন:

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

যদি আপনি pushd যে পাথটি বিদ্যমান থাকেন, আপনি এটি প্রবেশ করবেন এবং এটি 0 দিয়ে প্রস্থান করবে, যার অর্থ স্টেটমেন্টের then অংশটি কার্যকর হবে। যদি এটি বিদ্যমান না হয় তবে কিছুই ঘটবে না (ডিরেক্টরী বলার অপেক্ষা রাখে না যে আউটপুট বিদ্যমান নয়, যা সম্ভবত ডিবাগিংয়ের পক্ষে কোনও সহায়ক পার্শ্ব প্রতিক্রিয়া)।

এই তুলনায় ভাল মনে হয়, যা নিজেকে পুনরাবৃত্তি প্রয়োজন:

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 , ইত্যাদি দিয়ে কাজ করে ... যদি আপনি তাদের বিদ্যমান ফাইলগুলিতে চেষ্টা করেন তবে তারা একটি ত্রুটির সাথে প্রস্থান করবে এবং একটি বার্তা প্রিন্ট করবে যা বলছে যে এটি বিদ্যমান নেই এবং আপনার ব্লকটি হবে এড়ানো। যদি আপনি বিদ্যমান ফাইলগুলিতে তাদের চেষ্টা করেন তবে কমান্ড কার্যকর হবে এবং 0 স্থিতি দিয়ে প্রস্থান করবে, যা আপনার ব্লকটিকে কার্যকর করার অনুমতি দেবে।


আমি test tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS সংস্করণ লেখার যুক্তি পরীক্ষা আরও প্রাকৃতিক করে তোলে:

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

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

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

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

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

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


একটি ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করার জন্য আপনি যদি এটির মতো কাঠামো ব্যবহার করতে পারেন তবে:

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 

একটি শেল স্ক্রিপ্টে একটি ডিরেক্টরি বিদ্যমান কিনা তা পরীক্ষা করার জন্য আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

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 জনের অন্য উত্তরে ব্যাখ্যা করা হয়েছে ।

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


এখানে একটি খুব ব্যবহারিক idiom:

(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 আমাকে stderr ইতিমধ্যে একটি স্ট্যান্ডার্ড এক লাইন বার্তা দিতে হবে। আমি প্রদান করতে সক্ষম হবে তার চেয়ে আরও তথ্য দিতে হবে। একটি subshell ( ... ) মধ্যে cd সম্পাদন করে, কমান্ডটি কলকারীর বর্তমান ডিরেক্টরি প্রভাবিত করে না। ডিরেক্টরিটি যদি বিদ্যমান থাকে তবে এই উপশিরোনাম এবং ফাংশনটি কেবল একটি নন-অপ।

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

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

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

${parameter:?word}

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

এবং

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

এখানে word শেল ডকুমেন্টেশনটি অসাধারণ, যেমন word হোয়াইটস্পেস সহ কোন যুক্তিসঙ্গত স্ট্রিং উল্লেখ করতে পারে।

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

একটি দার্শনিক নোট: শেল একটি বস্তু ভিত্তিক ভাষা নয়, তাই বার্তাটি pathname নামক directory নয়। এই পর্যায়ে, আমি বরং এটি সহজ রাখতে চাই - একটি ফাংশন আর্গুমেন্ট শুধুমাত্র স্ট্রিং।


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

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

প্রকৃতপক্ষে, বুলেটপ্রুফ পদ্ধতির জন্য আপনাকে বিভিন্ন সরঞ্জাম ব্যবহার করতে হবে:

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), সুবিধাটি তার চেয়ে বড় কষ্ট।


ব্যাশ promt এই কোড টাইপ করুন

if [ -d "$DIRECTORY" ]; then
  # if true this block of code will execute
fi

যদি কোন ডিরেক্টরি বিদ্যমান থাকে কিনা তা যাচাই করতে চান, তবে এটি কোনও বাস্তব ডিরেক্টরি বা সিমলিংক কিনা, এটি ব্যবহার করুন:

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

ব্যাখ্যা: "ls" কমান্ডটি "ls: / x: কোনও ফাইল বা ডিরেক্টরি নেই" যদি ডিরেক্টরি বা সিমলিংক বিদ্যমান না থাকে এবং রিটার্ন কোডও সেট করে তবে আপনি "$?" এর মাধ্যমে পুনরুদ্ধার করতে পারবেন না। নাল (সাধারণত "1")। "Ls" কল করার পরে সরাসরি রিটার্ন কোডটি চেক করুন।


সংক্ষিপ্ত আকার:

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

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

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

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

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

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

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

    [[email protected] ~]$ ISDIR="$HOME/Music" 
    [[email protected] ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [[email protected] ~]$ [[ $(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.

    [[email protected] ~]$ touch "empty file.txt"
    [[email protected] ~]$ ISDIR="$HOME/empty file.txt" 
    [[email protected] ~]$ [[ $(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

[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"

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

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


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

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

Therfore:

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

if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi




posix