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