コードを強化しました質問以前に投稿したことがあります。
私のコードは次のとおりです
DIR="$1"
if [ -e "$DIR" ]
then
echo -n "total directories:" ; find $DIR -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
if [ -f "$DIR" ]
then
echo " Directory doesn't exist"
else
echo " please pass correct arguments"
fi
fi
./countfiledirs
orを実行すると、次のコードが出力されますcountfiledirs jhfsakl
。
sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs
please pass correct arguments
sreekanth@sreekanth-VirtualBox:~$ ./countfiledirs ffff
please pass correct arguments
スクリプト名を実行するときに./countfiledirs
出力したい。
please pass correct arguments
./countfiledirs ffff
次の場合:
directory doesn't exists
スクリプトを実行すると、コードに別の問題があります./countfiledirs /usr/share
。私が提供したパスの実際のディレクトリとサブディレクトリの数は提供されません。 3つの代わりに4つのディレクトリを表示
答え1
存在する場合は真である[ -f "$DIR" ]
かどうかをテストします。$DIR
ファイルです。それはあなたが望むものではありません。前の質問で提案したように、パラメータが渡されたことを$#
確認するために使用する必要があります。その後、以下を使用して-e
パラメーターが存在することを確認できます。
次の号には現在のカタログもfind
リストされています。これを防ぐためにGNUを.
使用できます。-mindepth 1
find
DIR="$1"
if [ $# -lt 1 ]
then
echo "Please pass at least one argument" && exit
fi
if [ -e "$DIR" ]
then
echo -n "total directories:" ; find "$DIR" -mindepth 1 -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
echo "Directory doesn't exist"
fi
上記を次のように圧縮することもできます(このバージョンはディレクトリではなく、存在しないディレクトリとファイルを区別しませんが)。
dir="$1"
[ $# -lt 1 ] && echo "Please pass at least one argument" && exit
[ -d "$dir" ] && printf "total directories: %s\ntotal files:%s\n" \
$(find "$dir" -type d | wc -l) $(find "$dir" -type f | wc -l) ||
printf "%s\n" "There is no directory named '$dir'."
答え2
最後の条件でわかるように、$ DIRが「一般ファイル」を参照していることを確認しています。つまり、ディレクトリではありません。したがって、常に失敗し(おそらく常にディレクトリを提供するため)、「正しい引数を渡してください」と印刷します。
ディレクトリの数が「間違っている」場合はそうではありません。スクリプトのように find コマンドを手動で実行すると、検索ルートディレクトリとサブディレクトリが返されることがわかります。したがって、与えられたディレクトリを計算していることがわかり、findを呼び出した後に単に数を減らして希望の答えを得ることができます。
これがあなたが探しているようです。ご了承ください。私はこれがうまくいくことを証明しましたが、BASHの専門家ではありません。
DIR="$1"
if [ ! -d "$DIR" ] #If not a directory,
then
echo " please pass correct arguments"
exit 1
fi
# We know for sure $DIR is present and a directory, so we know
# that it will show up in the find results for type d. Decrement.
echo -n "total directories:" $(($(find $DIR -type d | wc -l) - 1))
echo
echo -n "total files:" ; find $DIR -type f | wc -l