ディレクトリが空であることを確認する方法は?

ディレクトリが空であることを確認する方法は?

./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.

ベストアンサー1

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

上記はPOSIX互換テストで、非常に高速です。各ファイル/ディレクトリの各行を除くlsディレクトリ内のすべてのファイル/ディレクトリを一覧表示し、印刷できないすべての文字を引用します。...-A-1-q\nエライン含む)出力に疑問符があります?。これにより、grep入力が単一文字を受信した場合はtrueを返し、そうでない場合はfalseを返します。

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シェル-f以前はファイル名の生成は無効になっていません)上記のコマンドの後に位置引数のset配列をリテラル文字列に変換するか、各コマンドの最後にglob演算子によって生成されたフィールドに変換します。これが行われるかどうかは、globが実際に何と一致するかによって異なります。一部のシェルでは、解析されていない glob に null で拡張するか、まったく拡張しないように指示することができます。これは時々有益ですが、移植性がなく、特別なシェルオプションを設定してから後で設定を解除する必要があるなど、他の問題を引き起こすことがよくあります。"$@"set

NULL 引数を処理する唯一の移植可能な方法には、空または設定されていない変数または~チルダ拡張が含まれます。しかし、後者は前者よりはるかに安全です。

-e上記のシェルは、指定された3つのglobがすべて複数の一致で解決された場合にファイルが存在するかどうかをテストします。したがって、forループは3回以下の反復中にのみ実行され、空のディレクトリの場合、または1つ以上のパターンが単一のファイルとしてのみ検証される場合にのみ実行されます。 globのいずれかが実際のファイルを表す場合はsforでもありますbreak。可能性が最も高いものから可能性が最も低いものまでglobを注文したので、ほぼ毎回最初の反復で終了します。

いずれにせよ、関連するシステムコールは1つだけでなければなりませんstat()(シェル)。ディレクトリを照会し、そのファイルを一覧表示するlsためにのみ必要です。stat()ディレクトリエントリレポートが含まれています。これは、リストできるすべてのファイルの動作findと完全に対照的です。stat()

おすすめ記事