if文の処理

if文の処理

コードを強化しました質問以前に投稿したことがあります。

私のコードは次のとおりです

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

./countfiledirsorを実行すると、次のコードが出力されます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 1find

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

関連情報