วิธีตรวจสอบไดเรกทอรีว่างเปล่า


15

ฉันมีข้อกำหนดถ้าฉันเรียกใช้สคริปต์./123ด้วยอาร์กิวเมนต์ของพา ธ ว่างให้พูด/usr/share/linux-headers-3.16.0-34-generic/.tmp_versions(ไดเรกทอรีนี้ว่างเปล่า) มันควรจะแสดง "ไดเรกทอรีว่างเปล่า"

รหัสของฉันคือ:

#!/bin/bash
dir="$1"

if [ $# -ne 1 ]
then
    echo "please pass arguments" 
exit
fi

if [ -e $dir ]
then
printf "minimum file size: %s\n\t%s\n" \
 $(du $dir -hab | sort -n -r | tail -1)

printf "maximum file size: %s\n\t%s\n" \
 $(du $dir -ab | sort -n | tail -1)

printf "average file size: %s"
du $dir -sk | awk '{s+=$1}END{print s/NR}'
else
   echo " directory doesn't exists"
fi

if [ -d "ls -A $dir" ]
 then
    echo " directory is  empty"
fi

ฉันมีข้อผิดพลาดปรากฏขึ้นเช่นถ้าฉันรันชื่อสคริปต์./123 /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions(ไดเรกทอรีนี้ว่างเปล่า)

minimum file size: 4096
    /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions
maximum file size: 4096
    /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions
average file size: 4

แทนที่จะแสดงผลลัพธ์เฉพาะไดเรกทอรี "ว่างเปล่า" มันแสดงผลลัพธ์ข้างต้น

ผลลัพธ์ด้านล่างต้องแสดงถ้าฉันดำเนินการสคริปต์ด้วยอาร์กิวเมนต์ที่ถูกต้อง (ฉันหมายถึงเส้นทางไดเรกทอรีที่ถูกต้อง) พูด./123 /usr/share

minimum file size: 196
        /usr/share
    maximum file size: 14096
        /usr/share
    average file size: 4000

ผลลัพธ์ที่คาดหวังของฉันคือ: ./123 /usr/src/linux-headers-3.16.0-34-generic/.tmp_versions

directory is empty.


ใครบางคนได้โปรดตรวจสอบรหัสของฉันอีกครั้ง ฉันแก้ไขมัน
buddha sreekanth

เกี่ยวข้อง: superuser.com/questions/352289/…
AlikElzin-kilaka

คำตอบ:


20
if    ls -1qA ./somedir/ | grep -q .
then  ! echo somedir is not empty
else  echo somedir is empty
fi

ข้างต้นคือการทดสอบที่รองรับ POSIX - และควรรวดเร็วมาก lsจะแสดงรายการไฟล์ / dirs ทั้งหมดในไดเรกทอรียกเว้น.และ..แต่ละไฟล์ต่อบรรทัดและจะ-qใส่อักขระที่ไม่สามารถพิมพ์ได้ทั้งหมด(เพื่อรวม\newlines)ในผลลัพธ์ด้วย?เครื่องหมายคำถาม ด้วยวิธีนี้หากgrepได้รับแม้แต่ตัวเดียวในการป้อนข้อมูลก็จะกลับมาจริง - อื่นเท็จ

วิธีทำใน POSIX-shell เพียงอย่างเดียว:

cd  ./somedir/ || exit
set ./* ./.[!.]* ./..?*
if   [ -n "$4" ] ||
     for e do 
         [ -L "$e" ] ||
         [ -e "$e" ] && break
     done
then ! echo somedir is not empty
else   echo somedir is empty
fi
cd "$OLDPWD"

POSIX-shell (ซึ่งไม่ได้ปิดใช้งานการ-fสร้าง ilename ก่อนหน้านี้)จะsetเป็น"$@"อาร์เรย์ของพารามิเตอร์ตามตัวอักษรในสตริงตัวอักษรตามด้วยsetคำสั่งด้านบนหรืออื่น ๆ ไปยังฟิลด์ที่สร้างโดยตัวดำเนินการ glob ที่ส่วนท้ายของแต่ละ ไม่ว่าจะทำเช่นนั้นหรือไม่นั้นขึ้นอยู่กับว่า globs จริง ๆ แล้วตรงกับอะไร ในบางเชลล์คุณสามารถสั่งให้ glob ที่ไม่ได้รับการแก้ไขเพื่อขยายเป็นโมฆะหรือไม่มีอะไรเลย บางครั้งสิ่งนี้อาจเป็นประโยชน์ แต่ก็ไม่ได้พกพาได้และมักจะมีปัญหาเพิ่มเติม - เช่นต้องตั้งค่าตัวเลือกเชลล์พิเศษแล้วยกเลิกการตั้งค่า

วิธีพกพาเพียงวิธีเดียวในการจัดการอาร์กิวเมนต์ที่มีค่า Null เกี่ยวข้องกับตัวแปรที่ว่างเปล่าหรือไม่ได้ตั้งค่าหรือ~การขยายตัวของ tilde และอันที่จริงแล้วปลอดภัยกว่าอดีตมาก

ด้านบนของเชลล์ทดสอบเฉพาะไฟล์ใด ๆ สำหรับ-existence หากไม่มีการระบุทั้งสาม globs ให้แก้ไขมากกว่าหนึ่งคู่ที่ตรงกัน ดังนั้นการforวนซ้ำจะทำงานเพียงสามครั้งหรือน้อยกว่าและในกรณีของไดเรกทอรีว่างเปล่าหรือในกรณีที่หนึ่งหรือมากกว่าหนึ่งรูปแบบสามารถแก้ไขเป็นไฟล์เดียวเท่านั้น forยังbreaks ถ้าใด ๆ ของ globs แทนไฟล์จริง - และที่ผมได้จัด globs ในการสั่งซื้อมากที่สุดมีแนวโน้มที่จะมีแนวโน้มน้อยก็สวยมากควรจะลาออกในครั้งแรกย้ำทุกครั้ง

ทั้งสองวิธีที่คุณทำมันควรจะเกี่ยวข้องกับเพียงระบบเดียวstat()โทร - เปลือกและlsทั้งสองต้องการเพียงที่จะควรstat()ไดเรกทอรีสอบถามและรายชื่อออกไฟล์dentriesรายงานว่ามันมี สิ่งนี้ตรงกันข้ามกับพฤติกรรมfindที่จะแทนที่stat()ทุกไฟล์ที่คุณอาจมีอยู่


สามารถยืนยันได้ ฉันใช้ตัวอย่างเริ่มต้นของ mikeserv ในสคริปต์ที่ฉันเขียน
Otheus

ซึ่งจะรายงานว่าเป็นไดเรกทอรีว่างเปล่าที่ไม่มีอยู่หรือคุณไม่มีสิทธิ์เข้าถึงแบบอ่าน สำหรับอันที่สองหากคุณมีสิทธิ์เข้าถึงเพื่ออ่าน แต่ไม่ใช่การเข้าถึงการค้นหา YMMV
Stéphane Chazelas

@ StéphaneChazelas - บางที แต่รายงานดังกล่าวจะมาพร้อมกับข้อความแสดงข้อผิดพลาดเพื่อแจ้งให้ผู้ใช้ทราบ
mikeserv

1
เฉพาะในlsกรณี หม่นหมองและ[เงียบเมื่อพวกเขาไม่สามารถเข้าถึงได้ ตัวอย่างเช่น[ -e /var/spool/cron/crontabs/stephane ]จะรายงานเท็จอย่างเงียบ ๆ ในขณะที่มีไฟล์ชื่อนั้น
Stéphane Chazelas

โปรดทราบด้วยว่าโซลูชันเหล่านั้นจะไม่เทียบเท่าหาก somedir เป็น symlink ไปยังไดเรกทอรี (หรือไม่ใช่ไดเรกทอรี)
Stéphane Chazelas

6

ด้วย GNU หรือ BSD สมัยใหม่findคุณสามารถทำสิ่งต่อไปนี้

if find -- "$dir" -prune -type d -empty | grep -q .; then
  printf '%s\n' "$dir is an empty directory"
else
  printf >&2 '%s\n' "$dir is not empty, or is not a directory" \
                    "or is not readable or searchable in which case" \
                    "you should have seen an error message from find above."
fi

(ถือว่า$dirไม่ได้มีลักษณะเหมือนfindกริยา ( !, (, -name...)

POSIXly:

if [ -d "$dir" ] && files=$(ls -qAL -- "$dir") && [ -z "$files" ]; then
  printf '%s\n' "$dir is an empty directory"
else
  printf >&2 '%s\n' "$dir is not empty, or is not a directory" \
                    "or is not readable or searchable in which case" \
                    "you should have seen an error message from ls above."
fi

4

[-z $dir ]บ่นว่าไม่มีคำสั่งเรียก[-zบนระบบส่วนใหญ่ คุณจำเป็นต้องมีช่องว่างรอบวงเล็บ

[ -z $dir ]เกิดขึ้นเป็นจริงถ้าdirว่างเปล่าและเป็นเท็จค่าอื่น ๆ ส่วนใหญ่dirแต่ก็เป็นที่น่าเชื่อถือเช่นมันเป็นความจริงถ้าค่าของการdirเป็นหรือ= -z ใช้เครื่องหมายอัญประกาศคู่รอบการแทนคำสั่งเสมอ (ซึ่งจะเป็นส่วนที่เหลือของสคริปต์ของคุณเช่นกัน)-o -o -n -n

[ -z "$dir" ]ทดสอบว่าค่าของตัวแปรdirว่างเปล่าหรือไม่ ค่าของตัวแปรคือสตริงซึ่งเกิดขึ้นเป็นพา ธ ไปยังไดเรกทอรี ที่ไม่ได้บอกอะไรคุณเกี่ยวกับไดเรกทอรีเอง

ไม่มีโอเปอเรเตอร์ที่จะทดสอบว่าไดเรกทอรีว่างเปล่าหรือไม่เช่นเดียวกับไฟล์ปกติ ( [ -s "$dir" ]เป็นจริงสำหรับไดเรกทอรีแม้ว่าจะว่างเปล่า) วิธีง่ายๆในการทดสอบว่าไดเรกทอรีว่างเปล่าหรือไม่คือการแสดงรายการเนื้อหา หากคุณได้รับข้อความว่างไดเรกทอรีจะว่างเปล่า

if [ -z "$(ls -A -- "$dir")" ]; then 

ในระบบเก่าที่ไม่มีls -Aคุณสามารถใช้ls -aแต่แล้ว.และ..มีการระบุไว้

if [ -z "$(LC_ALL=C ls -a -- "$dir")" = ".
.." ]; then 

(อย่าเยื้องบรรทัดที่ขึ้นต้นด้วย..เนื่องจากสตริงจะต้องมีเพียงการขึ้นบรรทัดใหม่ไม่ใช่การขึ้นบรรทัดใหม่และเพิ่มพื้นที่ว่าง)


คุณช่วยอธิบายส่วนนี้ "$ (ls -A -" $ dir ")" ได้ไหม $ ในและนอกวงเล็บทำอะไร
พระพุทธชาวกรีก


@Giles "$ (ls -A -" $ dir ")" ไม่ทำงานผิดพลาดในการขว้าง
พระพุทธชาวกรีก

@buddhasreekanth เกิดข้อผิดพลาดอะไร คัดลอกวาง. คุณไม่สามารถคาดหวังให้คนอื่นช่วยคุณได้ถ้าคุณแค่พูดว่า "ไม่ทำงาน" โดยไม่อธิบายสิ่งที่คุณสังเกต
Gilles 'หยุดความชั่วร้าย' ใน

@Giles นี่เป็นข้อผิดพลาด เมื่อฉันรันสคริปต์. /festestats ข้อผิดพลาดในการขว้างมัน .. $ / filestats / home / sreekanth / testdir / aki / schatz ขนาดไฟล์ขั้นต่ำ: 4096 / home / sreekanth / testdir / aki / schatz ขนาดไฟล์สูงสุด: 4096 / home / sreekanth ขนาดไฟล์เฉลี่ย / testdir / aki / schatz: 4 ว่างเปล่า แทนที่จะแสดง "ไดเรกทอรีว่างเปล่า" มันแสดงที่มีขนาดต่ำสุดขนาดสูงสุดและขนาดเฉลี่ย
พระพุทธชาวกรีก

3

คุณกำลังดูคุณสมบัติของไดเรกทอรีเอง

$ mkdir /tmp/foo
$ ls -ld /tmp/foo
drwxr-xr-x 2 jackman jackman 4096 May  8 11:32 /tmp/foo
# ...........................^^^^

คุณต้องการนับจำนวนไฟล์ที่มี:

$ dir=/tmp/foo
$ shopt -s nullglob
$ files=( "$dir"/* "$dir"/.* )
$ echo ${#files[@]}
2
$ printf "%s\n" "${files[@]}"
/tmp/foo/.
/tmp/foo/..

ดังนั้นการทดสอบสำหรับ "ไดเรกทอรีว่าง" คือ:

function is_empty {
    local dir="$1"
    shopt -s nullglob
    local files=( "$dir"/* "$dir"/.* )
    [[ ${#files[@]} -eq 2 ]]
}

แบบนี้:

$ if is_empty /tmp/foo; then echo "it's empty"; else echo "not empty"; fi
it's empty
$ touch /tmp/foo/afile
$ if is_empty /tmp/foo; then echo "it's empty"; else echo "not empty"; fi
not empty

ซึ่งจะรายงานว่าไดเรกทอรีนั้นว่างเปล่าหากคุณไม่มีสิทธิ์เข้าถึงแบบอ่านหรือไม่มีอยู่
Stéphane Chazelas

1

คำตอบ tldr ของฉันคือ:

function emptydir {
 [ "$1/"* "" = "" ]  2> /dev/null &&
 [ "$1/"..?* "" = "" ]  2> /dev/null &&
 [ "$1/".[^.]* "" = "" ]  2> /dev/null ||
 [ "$1/"* = "$1/*" ]  2> /dev/null && [ ! -e "$1/*" ] &&
 [ "$1/".[^.]* = "$1/.[^.]*" ]  2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
 [ "$1/"..?* = "$1/..?*" ]  2> /dev/null && [ ! -e "$1/..?*" ]
}

มันเป็นไปตาม POSIX และไม่ว่ามันจะสำคัญมาก แต่โดยทั่วไปจะเร็วกว่าโซลูชันที่แสดงรายการไดเรกทอรีและไพพ์เอาต์พุตเป็น grep

การใช้งาน:

if emptydir adir
then
  echo "nothing found" 
else 
  echo "not empty" 
fi

ฉันชอบคำตอบhttps://unix.stackexchange.com/a/202276/160204ซึ่งฉันเขียนใหม่เป็น:

function emptydir {
  ! { ls -1qA "./$1/" | grep -q . ; }
}

มันแสดงรายการไดเรกทอรีและไพพ์ผลลัพธ์เป็น grep ฉันขอเสนอฟังก์ชั่นที่เรียบง่ายซึ่งมีพื้นฐานมาจากการขยายตัวและการเปรียบเทียบแบบกลม

function emptydir {   
 [ "$(shopt -s nullglob; echo "$1"/{,.[^.],..?}*)" = "" ]
}

ฟังก์ชั่นนี้ไม่ได้มาตรฐาน POSIX และเรียกร้อง subshell $()ด้วย ฉันอธิบายฟังก์ชั่นง่าย ๆ นี้ก่อนเพื่อให้เราสามารถเข้าใจวิธีแก้ปัญหาสุดท้ายได้ดีขึ้น (ดูคำตอบ tldr ด้านบน) ในภายหลัง

คำอธิบาย:

ด้านซ้ายมือ (LHS) จะว่างเปล่าเมื่อไม่มีการขยายเกิดขึ้นซึ่งเป็นกรณีเมื่อไดเรกทอรีว่างเปล่า จำเป็นต้องมีตัวเลือก nullglob เพราะไม่เช่นนั้นเมื่อไม่มีการจับคู่แล้วตัว glob จะเป็นผลลัพธ์ของการขยายตัว (การมี RHS ตรงกับ globs ของ LHS เมื่อไดเรกทอรีว่างเปล่าไม่ทำงานเนื่องจากผลบวกปลอมที่เกิดขึ้นเมื่อ LHS glob ตรงกับไฟล์เดียวชื่อเป็น glob ตัวเอง: *ใน glob ตรงกับสตริงย่อย*ในชื่อไฟล์ ) รั้งแสดงออก{,.[^.],..?}ครอบคลุมไฟล์ที่ซ่อนอยู่ แต่ไม่ได้ หรือ...

เนื่องจากshopt -s nullglobถูกดำเนินการภายใน$()(subshell) จึงไม่เปลี่ยนตัวnullglobเลือกของเชลล์ปัจจุบันซึ่งโดยปกติจะเป็นสิ่งที่ดี ในทางตรงกันข้ามมันเป็นความคิดที่ดีที่จะตั้งค่าตัวเลือกนี้ในสคริปต์เพราะข้อผิดพลาดมีแนวโน้มที่จะมี glob ส่งกลับบางสิ่งบางอย่างเมื่อไม่มีการแข่งขัน ดังนั้นหนึ่งสามารถตั้งค่าตัวเลือก nullglob ที่จุดเริ่มต้นของสคริปต์และจะไม่จำเป็นในฟังก์ชั่น โปรดระลึกไว้เสมอ: เราต้องการโซลูชันที่ใช้งานได้กับตัวเลือก nullglob

คำเตือน:

หากเราไม่มีสิทธิ์เข้าถึงแบบอ่านไปยังไดเรกทอรีฟังก์ชันจะรายงานเหมือนกับว่ามีไดเรกทอรีว่างเปล่า สิ่งนี้ใช้กับฟังก์ชันที่แสดงรายการไดเรกทอรีและ grep ผลลัพธ์ด้วย

shopt -s nullglobคำสั่งไม่ได้มาตรฐาน POSIX

มันใช้ subshell $()ที่สร้างขึ้นโดย มันไม่ใช่เรื่องใหญ่ แต่มันก็ดีถ้าเราสามารถหลีกเลี่ยงได้

มือโปร:

ไม่ใช่ว่ามันจะสำคัญ แต่ฟังก์ชั่นนี้เร็วกว่าฟังก์ชั่นก่อนหน้านี้ถึงสี่เท่าโดยวัดจากจำนวนเวลา CPU ที่ใช้ในเคอร์เนลภายในกระบวนการ

โซลูชั่นอื่น ๆ :

เราสามารถเอา POSIX ไม่ใช่shopt -s nullglobคำสั่งบน LHS และวางสาย"$1/* $1/.[^.]* $1/..?*"ใน RHS และกำจัดแยกบวกเท็จที่เกิดขึ้นเมื่อเรามีเพียงชื่อไฟล์'*', .[^.]*หรือ..?*ในไดเรกทอรี:

function emptydir {
 [ "$(echo "$1"/{,.[^.],..?}*)" = "$1/* $1/.[^.]* $1/..?*" ] &&
 [ ! -e "$1/*" ] && [ ! -e "$1/.[^.]*" ] && [ ! -e "$1/..?*" ]
}

หากไม่มีshopt -s nullglobคำสั่งตอนนี้ก็เหมาะสมแล้วที่จะลบ subshell แต่เราต้องระวังเพราะเราต้องการหลีกเลี่ยงการแยกคำและยังอนุญาตให้มีการขยายแบบกลมบน LHS โดยเฉพาะอย่างยิ่งการอ้างเพื่อหลีกเลี่ยงการแยกคำไม่ทำงานเพราะมันยังช่วยป้องกันการขยายตัวของ glob ทางออกของเราคือพิจารณา globs แยก:

function emptydir {
 [ "$1/"* = "$1/*" ] 2> /dev/null && [ ! -e "$1/*" ] &&
 [ "$1/".[^.]* = "$1/.[^.]*" ] 2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
 [ "$1/"..?* = "$1/..?*" ] 2> /dev/null && [ ! -e "$1/..?*" ]
}

เรายังคงมีการแบ่งคำสำหรับแต่ละ glob แต่มันก็โอเคตอนนี้เพราะมันจะส่งผลให้เกิดข้อผิดพลาดเมื่อไดเรกทอรีไม่ว่างเปล่า เราได้เพิ่ม 2> / dev / null เพื่อทิ้งข้อความแสดงข้อผิดพลาดเมื่อมีไฟล์จำนวนมากที่ตรงกับ glob ที่กำหนดบน LHS

เราจำได้ว่าเราต้องการโซลูชันที่ทำงานกับตัวเลือก nullglob เช่นกัน การแก้ปัญหาข้างต้นล้มเหลวด้วยตัวเลือก nullglob เพราะเมื่อไดเรกทอรีว่างเปล่า LHS ก็ว่างเปล่า โชคดีที่มันไม่เคยบอกว่าไดเรกทอรีว่างเปล่าเมื่อไม่มี มันล้มเหลวที่จะบอกว่ามันว่างเปล่าเมื่อมันเป็น ดังนั้นเราสามารถจัดการตัวเลือก nullglob แยกกัน เราไม่สามารถเพิ่มเคส[ "$1/"* = "" ]และอื่น ๆ ได้เพราะสิ่งเหล่านี้จะขยายเป็น[ = "" ]ฯลฯ ซึ่งไม่ถูกต้องทางไวยากรณ์ ดังนั้นเราจึงใช้ [ "$1/"* "" = "" ]ฯลฯ แทน เราอีกครั้งจะต้องพิจารณากรณีที่สาม*, ..?*และ.[^.]*เพื่อให้ตรงกับไฟล์ที่ซ่อนอยู่ แต่ไม่ได้.และ... สิ่งเหล่านี้จะไม่รบกวนถ้าเราไม่มีตัวเลือก nullglob เพราะพวกเขายังไม่เคยพูดว่ามันว่างเปล่าเมื่อไม่มี ดังนั้นทางออกที่เสนอสุดท้ายคือ:

function emptydir {
 [ "$1/"* "" = "" ]  2> /dev/null &&
 [ "$1/"..?* "" = "" ]  2> /dev/null &&
 [ "$1/".[^.]* "" = "" ]  2> /dev/null ||
 [ "$1/"* = "$1/*" ]  2> /dev/null && [ ! -e "$1/*" ] &&
 [ "$1/".[^.]* = "$1/.[^.]*" ]  2> /dev/null && [ ! -e "$1/.[^.]*" ] &&
 [ "$1/"..?* = "$1/..?*" ]  2> /dev/null && [ ! -e "$1/..?*" ]
}

ความกังวลด้านความปลอดภัย:

สร้างสองไฟล์rmและxในไดเรกทอรีว่างและดำเนินการ*ในการแจ้งให้ glob *จะขยายไปและจะต้องดำเนินการเพื่อลบrm x xนี้ไม่ได้เป็นความกังวลด้านความปลอดภัยในการทำงานเพราะเรา globs จะอยู่ที่การขยายตัวจะไม่ได้มองว่าเป็นคำสั่ง for f in *แต่เป็นข้อโต้แย้งเช่นเดียวกับใน


$(set -f; echo "$1"/*)"$1/*"ดูเหมือนว่าเป็นวิธีที่ค่อนข้างซับซ้อนของการเขียน และสิ่งนี้จะไม่ตรงกับไดเรกทอรีหรือไฟล์ที่ซ่อนอยู่
muru

สิ่งที่ผมหมายถึงคือการที่ไม่มีการขยายตัวในชื่อไฟล์"$1/*"(หมายเหตุคำพูดรวม*) ดังนั้นset -fและ subshell ที่ไม่จำเป็นสำหรับที่โดยเฉพาะอย่างยิ่ง
muru

มันตอบคำถามที่แตกต่าง: ไม่ว่าจะเป็นไดเรกทอรีที่มีไฟล์หรือไดเรกทอรีที่ซ่อนอยู่ ฉันขอโทษเกี่ยวกับเรื่องนั้น ฉันยินดีที่จะลบ
Dominic108

1
มีวิธีการเพื่อให้ตรงกับไฟล์ที่ซ่อนเกินไป (ดู glob ซับซ้อนในคำตอบของ mikeserv : ./* ./.[!.]* ./..?*) บางทีคุณอาจรวมที่จะทำให้ฟังก์ชั่นเสร็จสมบูรณ์
muru

อา ! ฉันจะดูที่สิ่งนี้และเรียนรู้และบางทีเราอาจมีคำตอบที่สมบูรณ์ตามการขยายตัวแบบวนรอบ!
Dominic108

0

นี่เป็นอีกวิธีง่ายๆในการทำ สมมติว่า D เป็นชื่อพา ธ เต็มของไดเรกทอรีที่คุณต้องการทดสอบความว่างเปล่า

แล้วก็

if [[ $( du -s  D |awk ' {print $1}') = 0 ]]
then
      echo D is empty
fi

ใช้งานได้เพราะ

du -s D

มีเป็นเอาท์พุท

size_of_D   D

awk ลบ D และถ้าขนาดเป็น 0 ไดเรกทอรีจะว่างเปล่า


-1
#/bin/sh

somedir=somedir
list="`echo "$somedir"/*`"

test "$list" = "$somedir/*" && echo "$somedir is empty"

# dot prefixed entries would be skipped though, you have to explicitly check them

2
สวัสดีและยินดีต้อนรับสู่เว็บไซต์ กรุณาอย่าโพสต์คำตอบที่เป็นเพียงรหัสและไม่มีคำอธิบาย แสดงความคิดเห็นรหัสหรืออธิบายสิ่งที่คุณกำลังทำ โดยวิธีการที่มีเหตุผลที่จะใช้ไม่ได้ทั้งหมดที่คุณต้องการก็คือecho list="$somedir/*"นอกจากนี้ยังยุ่งยากและมีแนวโน้มที่จะเกิดข้อผิดพลาด คุณยังไม่ได้กล่าวถึงว่า OP ควรให้เส้นทางของ dir เป้าหมายรวมถึงเครื่องหมายสแลชต่อท้ายตัวอย่างเช่น
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.