คำสั่งอะไรที่สามารถใช้ตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่ภายในสคริปต์เชลล์ Bash
คำสั่งอะไรที่สามารถใช้ตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่ภายในสคริปต์เชลล์ Bash
คำตอบ:
ในการตรวจสอบว่ามีไดเร็กทอรีอยู่ในเชลล์สคริปต์หรือไม่คุณสามารถใช้คำสั่งต่อไปนี้:
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
อย่างไรก็ตามตามที่Jon Ericsonระบุไว้คำสั่งที่ตามมาอาจไม่ทำงานตามที่ตั้งใจถ้าคุณไม่คำนึงว่าลิงก์สัญลักษณ์ไปยังไดเรกทอรีจะผ่านการตรวจสอบนี้เช่นกัน เช่นใช้สิ่งนี้:
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
จดบันทึกเครื่องหมายคำพูดคู่ที่ใช้ห่อหุ้มตัวแปรโดยเฉพาะ เหตุผลนี้จะอธิบายโดย 8jean ในคำตอบอื่น
หากตัวแปรมีช่องว่างหรืออักขระผิดปกติอื่น ๆ อาจเป็นสาเหตุให้สคริปต์ล้มเหลว
[ ! -d "$DIRECTORY" ]
จะเป็นจริง แต่อย่างใดถ้า$DIRECTORY
ไม่ได้อยู่หรือถ้าไม่อยู่ แต่ไม่ได้เป็นไดเรกทอรี พิจารณาสิ่งที่ชอบif [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi
; สิ่งนี้จะล้มเหลวหาก"$DIRECTORY"
เป็นไฟล์ (แน่นอนคุณควรตรวจสอบว่าmkdir
สำเร็จหรือไม่มีหลายสาเหตุที่ทำให้ล้มเหลว)
-d
) และ symlink ( -L
) if [ -d "${THING:+$THING/}" ]
ก็ง่ายเพียงแค่ต่อท้ายเฉือนกับตัวแปรเช่น ไดเรกทอรีจะไม่รังเกียจเครื่องหมายทับ ไฟล์จะประเมินเป็นเท็จ Empty จะยังคงว่างเปล่าดังนั้น false และ symlink จะได้รับการแก้ไขไปยังปลายทาง แน่นอนมันขึ้นอยู่กับเป้าหมายของคุณ ถ้าคุณอยากไปที่นั่นก็โอเค หากคุณต้องการที่จะลบมันแล้วรหัสในคำตอบนี้จะดีกว่า
อย่าลืมล้อมตัวแปรด้วยเครื่องหมายคำพูดคู่เสมอเมื่ออ้างอิงถึงมันในสคริปต์ Bash เด็กวันนี้เติบโตขึ้นมาด้วยความคิดที่ว่าพวกเขาสามารถมีช่องว่างและตัวละครตลกอื่น ๆ อีกมากมายในชื่อไดเรกทอรีของพวกเขา (Spaces! ย้อนกลับไปในสมัยของเราพวกเราไม่มีช่องว่างแฟนซี!;)
อยู่มาวันหนึ่งเด็กคนหนึ่งจะเรียกใช้สคริปต์ของคุณด้วยการ$DIRECTORY
ตั้งค่า"My M0viez"
และสคริปต์ของคุณจะระเบิด คุณไม่ต้องการที่ ดังนั้นใช้สิ่งนี้
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
หมายเหตุการทดสอบ-dสามารถสร้างผลลัพธ์ที่น่าประหลาดใจ:
$ 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
ท่านสามารถหาข้อมูลเพิ่มเติมในคู่มือการทุบตีในการแสดงออกเงื่อนไขทุบตีและ[
คำสั่ง builtinและcommmand[[
สารประกอบ
if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi
... หรือสำหรับคำสั่งหนึ่งที่สามารถทำงานได้ทั้งการเชื่อมโยงและ dirs:rm -r tmpdir
ผมหาคู่วงเล็บรุ่นtest
ทำให้การเขียนการทดสอบตรรกะเป็นธรรมชาติมากขึ้น:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
if [[ -d "$TARFILE" ]]
ฉัน [[: ไม่พบ
[[ ]]
ได้รับการสนับสนุน [ ]
แต่ไม่ได้ในความเป็นจริงให้การทำงานที่แตกต่างกันไป หากการพกพาเป็นเรื่องที่น่ากังวลให้[ ]
ใช้วิธีแก้ไขปัญหาที่จำเป็น
แบบฟอร์มสั้น:
[ -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
builtin แต่อาร์กิวเมนต์สุดท้ายต้องเป็นตัวอักษรเพื่อให้ตรงกับการเปิด]
[
สำหรับตัวเลือกที่เป็นไปได้หรือความช่วยเหลือเพิ่มเติมให้ตรวจสอบ:
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
ภายใน subshell( ... )
คำสั่งจะไม่ส่งผลกระทบต่อไดเรกทอรีปัจจุบันของผู้โทร ถ้ามีไดเรกทอรีอยู่, subshell นี้และฟังก์ชั่นเป็นเพียงแค่ไม่มี
ถัดไปเป็นข้อโต้แย้งที่ว่าเราส่งผ่านไปยัง:cd
${1:?pathname expected}
นี่เป็นรูปแบบที่ซับซ้อนยิ่งขึ้นของการทดแทนพารามิเตอร์ซึ่งจะอธิบายในรายละเอียดเพิ่มเติมด้านล่าง
Tl; dr: ถ้าสตริงที่ส่งผ่านไปยังฟังก์ชั่นนี้ว่างเปล่าเราจะออกจาก subshell อีกครั้ง( ... )
และกลับมาจากฟังก์ชั่นด้วยข้อความแสดงข้อผิดพลาดที่กำหนด
ข้อความจากksh93
หน้าคน:
${parameter:?word}
หาก
parameter
มีการตั้งค่าและไม่เป็นโมฆะให้แทนที่ค่าของมัน มิฉะนั้นให้พิมพ์word
และออกจากเชลล์ (หากไม่ใช่แบบโต้ตอบ) หากword
ไม่ได้ระบุไว้ข้อความมาตรฐานจะถูกพิมพ์
และ
หากไม่ได้ระบุเครื่องหมายจุดคู่
:
จากการแสดงออกด้านบนเชลล์จะตรวจสอบเฉพาะพารามิเตอร์ที่ตั้งค่าไว้หรือไม่
การใช้ถ้อยคำที่นี่เป็นเรื่องแปลกสำหรับเอกสารเชลล์ซึ่งword
อาจอ้างอิงถึงสตริงที่สมเหตุสมผลรวมถึงช่องว่าง
ในกรณีพิเศษนี้ฉันรู้ว่าข้อความแสดงข้อผิดพลาดมาตรฐาน1: parameter not set
ไม่เพียงพอดังนั้นฉันจึงซูมเข้ากับประเภทของค่าที่เราคาดหวังที่นี่ - pathname
ของไดเรกทอรี
บันทึกปรัชญา:
เปลือกไม่ได้เป็นภาษาเชิงวัตถุดังนั้นข้อความบอกว่าไม่pathname
directory
ในระดับนี้ฉันต้องการให้มันง่าย - ข้อโต้แย้งของฟังก์ชั่นเป็นเพียงสตริง
test -d
@Grundlefleck อธิบาย
test -d /unreadable/exists
จะล้มเหลวแม้ว่าข้อโต้แย้งจะมีอยู่
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
รหัสข้างต้นจะตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่และสามารถเขียนได้หรือไม่
DIRECTORY=/tmp
if [ -d "$DIRECTORY" ]; then
echo "Exists"
fi
space
หลังจากที่[
-> [ `` ฉันได้รับข้อผิดพลาดเนื่องจากไม่มีที่ว่าง
พิมพ์รหัสนี้ในพรอมต์ Bash:
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'
ความคิดของคุณอาจจะเป็นประโยชน์ในการตรวจสอบการดำรงอยู่ของไดเรกทอรีขึ้นอยู่กับรูปแบบเช่นนี้: คุณรังเกียจไหมถ้าฉันต่อท้ายคำตอบนี้ Cheers;)
ที่จริงแล้วคุณควรใช้เครื่องมือหลายอย่างเพื่อให้ได้วิธีกันกระสุน:
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
ไม่มีความจำเป็นใด ๆ "${}"
ที่จะต้องกังวลเกี่ยวกับช่องว่างและอักขระพิเศษตราบใดที่คุณใช้
โปรดทราบว่า[[]]
ไม่สามารถพกพาได้[]
แต่เนื่องจากคนส่วนใหญ่ทำงานกับรุ่นที่ทันสมัยของ Bash (เพราะหลังจากนั้นคนส่วนใหญ่ไม่ได้ทำงานกับ command line :-p) ประโยชน์จึงยิ่งใหญ่กว่าปัญหา
คุณเคยคิดที่จะทำในสิ่งที่คุณอยากทำif
แทนที่จะมองข้ามหรือไม่?
คือถ้าคุณต้องการตรวจสอบการมีอยู่ของไดเรกทอรีก่อนที่คุณจะเข้าไปลองทำสิ่งนี้:
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
ฯลฯ ... ถ้าคุณลองพวกเขาในไฟล์ที่ไม่อยู่พวกเขาจะออกจากที่มีข้อผิดพลาดและพิมพ์ข้อความบอกว่ามันไม่ได้อยู่ของคุณและ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
โปรแกรม เมื่อพิจารณาถึงไดเรกทอรีทั้งหมดเป็นไฟล์ใน Linux การออกคำสั่งต่อไปนี้น่าจะพอเพียง:
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;
หากคุณต้องการตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่ไม่ว่าจะเป็นไดเรกทอรีจริงหรือ symlink ให้ใช้สิ่งนี้:
ls $DIR
if [ $? != 0 ]; then
echo "Directory $DIR already exists!"
exit 1;
fi
echo "Directory $DIR does not exist..."
คำอธิบาย: คำสั่ง "ls" ให้ข้อผิดพลาด "ls: / x: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" หากไม่มีไดเรกทอรีหรือ symlink และตั้งค่ารหัสส่งคืนซึ่งคุณสามารถเรียกคืนผ่าน "$?" เพื่อไม่ใช่ - ว่าง (ปกติ "1") ตรวจสอบให้แน่ใจว่าคุณตรวจสอบรหัสส่งคืนโดยตรงหลังจากเรียก "ls"
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: ไม่: ไม่พบ [ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว]
มีทางออกที่ดีออกมี แต่ท้ายที่สุดทุกสคริปต์จะล้มเหลวหากคุณไม่ได้อยู่ในไดเรกทอรีที่ถูกต้อง ดังนั้นรหัสเช่นนี้:
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
จะดำเนินการได้สำเร็จหากในขณะที่คุณอยู่ในไดเรกทอรีที่มีไดเรกทอรีย่อยที่คุณตรวจสอบ
ฉันเข้าใจคำถามเริ่มต้นเช่นนี้เพื่อตรวจสอบว่าไดเรกทอรีมีอยู่โดยไม่คำนึงถึงตำแหน่งของผู้ใช้ในระบบไฟล์หรือไม่ ดังนั้นการใช้คำสั่ง 'ค้นหา' อาจทำเคล็ดลับ:
dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d
วิธีการแก้ปัญหานี้ดีเพราะช่วยให้การใช้สัญลักษณ์แทนซึ่งเป็นคุณสมบัติที่มีประโยชน์เมื่อค้นหาไฟล์ / ไดเรกทอรี ปัญหาเพียงอย่างเดียวคือถ้าไม่มีไดเร็กทอรีการค้นหาคำสั่ง 'find' จะพิมพ์อะไรไปยังเอาต์พุตมาตรฐาน (ไม่ใช่โซลูชันที่สวยงามสำหรับรสนิยมของฉัน) และจะไม่มีทางออกศูนย์ บางทีอาจมีคนปรับปรุงเรื่องนี้
locate
แต่ไม่ดีสำหรับสิ่งอื่น ...
--
ขอแนะนำให้ใช้ (เครื่องหมายสิ้นสุดของตัวเลือก) มิฉะนั้นหากตัวแปรของคุณมีบางอย่างที่ดูเหมือนตัวเลือกสคริปต์จะล้มเหลวเช่นเดียวกับการเว้นวรรค