বাশ শেল স্ক্রিপ্টের মধ্যে ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে কোন কমান্ড ব্যবহার করা যেতে পারে?
বাশ শেল স্ক্রিপ্টের মধ্যে ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে কোন কমান্ড ব্যবহার করা যেতে পারে?
উত্তর:
কোনও শেল স্ক্রিপ্টে ডিরেক্টরি রয়েছে কিনা তা পরীক্ষা করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:
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 জিয়ন অন্য একটি উত্তরে ব্যাখ্যা করেছেন ।
যদি ভেরিয়েবলগুলিতে স্পেস বা অন্যান্য অস্বাভাবিক অক্ষর থাকে তবে এটি সম্ভবত স্ক্রিপ্টটি ব্যর্থ হতে পারে।
[ ! -d "$DIRECTORY" ]
তা যদি সত্য হয় তবে $DIRECTORY
তা যদি না থাকে তবে বা যদি তা না থাকে তবে ডিরেক্টরি নয়। এর মতো কিছু বিবেচনা করুন if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi
; "$DIRECTORY"
কোনও ফাইল হলে এটি ব্যর্থ হবে । (অবশ্যই আপনার mkdir
যাইহোক যাইহোক সফল হয়েছে কিনা তা পরীক্ষা করা উচিত ; এটি ব্যর্থ হতে পারে তার বেশ কয়েকটি কারণ রয়েছে))
-d
) এবং সিমলিংক ( -L
) উভয়ের জন্য পরীক্ষা করার পরিবর্তে ভেরিয়েবলের মতো স্ল্যাশ যুক্ত করা সহজ if [ -d "${THING:+$THING/}" ]
। একটি ডিরেক্টরি অতিরিক্ত স্ল্যাশ মনে করবে না। একটি ফাইল মিথ্যাতে মূল্যায়ন করবে। খালি ফাঁকা থাকবে, তাই মিথ্যা। এবং একটি সিমিলিংক এর গন্তব্যে সমাধান করা হবে। অবশ্যই এটি আপনার লক্ষ্যের উপর নির্ভর করে। আপনি যদি সেখানে যেতে চান তবে এটি ঠিক আছে। আপনি যদি এটি মুছতে চান তবে এই উত্তরের কোডটি আরও ভাল।
বাশ স্ক্রিপ্টে রেফারেন্স করার সময় ডাবল উদ্ধৃতিতে সর্বদা ভেরিয়েবলগুলি মোড়ানো মনে রাখবেন। বাচ্চারা এই দিনগুলিতে এই ধারণাটি নিয়ে বড় হয় যে তাদের ডিরেক্টরিতে স্পেস এবং প্রচুর অন্যান্য মজাদার অক্ষর থাকতে পারে। (স্পেসস! আমার দিনগুলিতে, আমাদের কোনও অভিনব স্পেস ছিল না!))
একদিন, সেই বাচ্চাদের মধ্যে একটি আপনার $DIRECTORY
সেটটি সেট করে স্ক্রিপ্টটি চালাবে এবং আপনার স্ক্রিপ্টটি ফুরিয়ে "My M0viez"
যাবে। আপনি এটা চান না। সুতরাং এটি ব্যবহার করুন।
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
নোট- ডি পরীক্ষাটি কিছু আশ্চর্যজনক ফলাফল আনতে পারে:
$ 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
আপনি বাশ শর্তসাপেক্ষ এক্সপ্রেশন এবং বিল্টিন [
কমান্ড এবং [[
যৌগিক কম্যান্ডে বাশ ম্যানুয়ালটিতে আরও তথ্য পেতে পারেন ।
if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi
... বা, এমন একটি আদেশের জন্য যা লিঙ্ক ও ডায়ার উভয় ক্ষেত্রেই কাজ করে:rm -r tmpdir
যুক্তি পরীক্ষার লিখনকে আরও প্রাকৃতিক করে তোলে এর ডাবল-বন্ধনী সংস্করণটি আমি খুঁজে পাই test
:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
if [[ -d "$TARFILE" ]]
আমি পাচ্ছি [[: পাওয়া যায়নি
[[ ]]
সমর্থন করে তবে বাস্তবে এতে কোনও আলাদা কার্যকারিতা সরবরাহ করে না [ ]
। যদি বহনযোগ্যতা কোনও উদ্বেগের বিষয় থাকে [ ]
তবে প্রয়োজনীয় workaround সাথে আটকে থাকুন এবং ব্যবহার করুন।
খাটো ফর্ম:
[ -d "$DIR" ] && echo "Yes"
if $dir is a dir, then echo "yes"
? কিছুটা ব্যাখ্যা সাহায্য করবে :)
cmd && other
এটি একটি সাধারণ শর্টহ্যান্ড if cmd; then other; fi
- এটি বেশিরভাগ প্রোগ্রামিং ভাষার সাথে কাজ করে যা বুলিয়ান যুক্তি সমর্থন করে এবং শর্ট সার্কিট মূল্যায়ন হিসাবে পরিচিত ।
set -e
(যা শেল প্রোগ্রামিংয়ের সেরা অনুশীলন )।
[ -d "$DIR" ]
চেক করা হয়েছে (তারপরে && echo Yes
), তাই আমার বিশ্বাস set -e
স্ক্রিপ্ট আচরণের ক্ষেত্রে কোনও তফাত আসে না (উদাহরণস্বরূপ যদি পরীক্ষা ব্যর্থ হয় তবে স্ক্রিপ্টটি স্বাভাবিকভাবে চলতে থাকে)।
ডিরেক্টরি উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে আপনি 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
ডিরেক্টরি বা ফাইল উপস্থিত কিনা তা পরীক্ষা করার জন্য একটি সাধারণ স্ক্রিপ্ট:
if [ -d /home/ram/dir ] # For file "if [-f /home/rama/file]"
then
echo "dir present"
else
echo "dir not present"
fi
ডিরেক্টরি উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য একটি সাধারণ স্ক্রিপ্ট:
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' তৈরি করতে পারে না: ফাইল বিদ্যমান
আপনি ব্যবহার করতে পারেন test -d
(দেখুন man test
)।
-d file
যদি ফাইল বিদ্যমান থাকে এবং ডিরেক্টরি হয় তবে এটি সত্য।
উদাহরণ স্বরূপ:
test -d "/etc" && echo Exists || echo Does not exist
দ্রষ্টব্য: test
কমান্ডটি শর্তসাপেক্ষ অভিব্যক্তির সমান [
(দেখুন man [
:), সুতরাং এটি শেল স্ক্রিপ্টগুলিতে পোর্টেবল।
[
- এটিtest
বিল্টিনের প্রতিশব্দ , তবে শেষ যুক্তিটি অবশ্যই শাব্দিক হওয়া উচিত,]
খোলার সাথে মেলে[
।
সম্ভাব্য বিকল্প বা আরও সহায়তার জন্য, চেক করুন:
help [
help test
man test
অথবা man [
বা সম্পূর্ণ অকেজো কিছু জন্য:
[ -d . ] || echo "No"
এখানে একটি খুব বাস্তববাদী প্রতিমা আছে:
(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
test -d /unreadable/exists
তর্ক থাকলেও ব্যর্থ হবে।
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
ডিরেক্টরি বিদ্যমান কিনা তা উপরের কোডটি পরীক্ষা করে এবং এটি লিখনযোগ্য কিনা।
DIRECTORY=/tmp
if [ -d "$DIRECTORY" ]; then
echo "Exists"
fi
space
পরে [
-> [`` -d । জায়গা হারিয়ে যাওয়ার কারণে আমি ত্রুটি পেয়েছি
বাশ প্রম্পটে এই কোডটি টাইপ করুন:
if [ -d "$DIRECTORY" ]; then
# If true this block of code will execute
fi
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'
। আমি আপনার উত্তরে এই কৌশলটি সংযোজন করলাম তাতে কি আপত্তি আছে? চিয়ার্স;)
আসলে, বুলেটপ্রুফ পদ্ধতির জন্য আপনার বেশ কয়েকটি সরঞ্জাম ব্যবহার করা উচিত:
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 দিয়েও কাজ করে না), লাভটি ঝামেলার চেয়ে বেশি।
আপনি কি 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
ব্লককে সম্পাদন করতে দেয় ।
একাধিক ডিরেক্টরি যাচাই করতে এই কোডটি ব্যবহার করুন:
if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
# Things to do
fi
ডিরেক্টরিটি বিদ্যমান কিনা তা পরীক্ষা করুন, অন্যটি তৈরি করুন:
[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
mkdir -p "$DIRECTORY"
একই প্রভাব জন্য ব্যবহার করতে পারেন ।
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"
এনবি: ভেরিয়েবলগুলি উদ্ধৃত করা একটি ভাল অনুশীলন।
ব্যাখ্যা:
-d
: এটি ডিরেক্টরি কিনা তা পরীক্ষা করুন-L
: এটি একটি প্রতীকী লিঙ্ক কিনা তা পরীক্ষা করুন[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
এই উত্তরটি শেল স্ক্রিপ্ট হিসাবে মোড়ানো
$ 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
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";
ব্যবহার -e
চেক ফাইলের জন্য চেক করবে এবং এই ডিরেক্টরি অন্তর্ভুক্ত করা হয়েছে।
if [ -e ${FILE_PATH_AND_NAME} ]
then
echo "The file or directory exists."
fi
অনুযায়ী জনাথন এর মন্তব্যে:
আপনি যদি ডিরেক্টরিটি তৈরি করতে চান এবং এটি এখনও বিদ্যমান নেই, তবে সহজ কৌশলটি হ'ল mkdir -p
ডিরেক্টরি তৈরি করে - এবং যে কোনও ডিরেক্টরি অনুপস্থিত রয়েছে - ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান থাকলে ব্যর্থ হয় না, তাই আপনি এটি সব করতে পারেন সাথে একবারে:
mkdir -p /some/directory/you/want/to/exist || exit 1
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
file
প্রোগ্রামটি ব্যবহার করুন । সমস্ত ডিরেক্টরি ডিরেক্টরিতে লিনাক্সের ফাইল হিসাবে বিবেচনা করে নিম্নলিখিত কমান্ড প্রদান করা যথেষ্ট হবে:
file $directory_name
অস্তিত্বহীন ফাইল চেক করা হচ্ছে: file blah
আউটপুট: cannot open 'blah' (No such file or directory)
একটি বিদ্যমান ডিরেক্টরি পরীক্ষা করা হচ্ছে: file bluh
আউটপুট: bluh: directory
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
file="foo"
if [[ -e "$file" ]]; then echo "File Exists"; fi;
আপনি যদি ডিরেক্টরিটি সত্যিকারের ডিরেক্টরি বা সিমলিংক নির্বিশেষে কোনও ডিরেক্টরি উপস্থিত কিনা তা পরীক্ষা করতে চান তবে এটি ব্যবহার করুন:
ls $DIR
if [ $? != 0 ]; then
echo "Directory $DIR already exists!"
exit 1;
fi
echo "Directory $DIR does not exist..."
ব্যাখ্যা: "ls" কমান্ডটি একটি ত্রুটি দেয় "ls: / x: ডিরেক্টরি বা সিমিলিংকের উপস্থিত না থাকলে এই জাতীয় কোনও ফাইল বা ডিরেক্টরি" নেই এবং আপনি "$?" এর মাধ্যমে পুনরুদ্ধার করতে পারেন এমন কোডটিও সেট করে যা অ " -নুল (সাধারণত "1")। নিশ্চিত হয়ে নিন যে আপনি "এলএস" কল করার পরে রিটার্ন কোডটি সরাসরি পরীক্ষা করেছেন।
if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
(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 [এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই]
এখানে দুর্দান্ত সমাধান রয়েছে, তবে শেষ পর্যন্ত প্রতিটি স্ক্রিপ্ট ব্যর্থ হবে যদি আপনি সঠিক ডিরেক্টরিতে না থাকেন। সুতরাং কোড এর মত:
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
এই সমাধানটি ভাল কারণ এটি ফাইল / ডিরেক্টরি অনুসন্ধানের সময় ওয়াইল্ডকার্ডগুলির একটি দরকারী বৈশিষ্ট্য ব্যবহার করার অনুমতি দেয়। একমাত্র সমস্যাটি হ'ল, যদি অনুসন্ধান ডিরেক্টরিটি বিদ্যমান না থাকে তবে 'ফাইন্ড' কমান্ডটি স্ট্যান্ডার্ড আউটপুটে (আমার স্বাদের জন্য মার্জিত সমাধান নয়) মুদ্রণ করবে এবং তবুও শূন্য প্রস্থান থাকবে। সম্ভবত কেউ এই উন্নতি করতে পারে।
locate
জন্য ভাল তবে অন্য কোনও কিছুর জন্য ভাল নয় ...
--
প্রস্তাব দেওয়া হয় (বিকল্পগুলির শেষের দিকে)। অন্যথায়, যদি আপনার চলকটিতে কোনও বিকল্পের মতো দেখতে এমন কিছু থাকে তবে স্ক্রিপ্টটি ফাঁকা জায়গাগুলির মতোই ব্যর্থ হবে।