2016-09-29 3 views
1

ファイル数とローカルディレクトリのディレクトリ数をカウントするためのbashスクリプトを作成しようとしていました。ファイル名とディレクトリ名をbashで繰り返す

#!/bin/bash 
files=0 
dir=0 
for file in `ls` 
do 
    if [ -d $file ] 
    then 
     dir=$(($dir+1)) 
    else 
     files=$(($files+1)) 
    fi 
done 
echo "files=$files, direcotries=$dir" 

しかし、forコマンドは、私が期待するとして、ファイルやディレクトリの名前を反復処理されていません。これが私の最初の試みでした。ファイルouディレクトリの名前にスペースが含まれていると、これはうまく動作しません。名前にスペースがある場合、変数 "ファイル"は、ファイル(またはディレクトリ)名中の各単語の値を仮定します。

これを行う方法はありますか?

+0

'ls'を使うだけで、いくつかのファイルやディレクトリが見当たらないことに注意してください。本当にそれらのすべてを取得するには、代わりに 'ls -A'を使用してください。 – user1934428

答えて

1

ワイルドカード:for file in *; do …; doneを使用してください。それは正しい名前のスペースを維持します。考慮するshopt -s nullglobも。あなたのコードも私の提案も、ドット.で始まる名前をリストしていません。

また、間隔の問題を避けるために、変数値の前後に二重引用符を使用してif [ -d "$file" ]を使用してください。したがって

:bashで

#!/bin/bash 

shopt -s nullglob 
files=0 
dir=0 
for file in * 
do 
    if [ -d "$file" ] 
    then 
     dir=$(($dir+1)) 
    else 
     files=$(($files+1)) 
    fi 
done 
echo "files=$files, directories=$dir" 

、例えば((files++))等の演算を書き込む他の方法もあります。

1

ジョナサン・レフラーの答えは、あなたが必要とするものとまったく同じだと思います。

bashのアレイのパワーを示し、ループの必要性を排除する代替次のよう

shopt -s nullglob 
dirs=(*/) 
ndir="${#dirs[@]}" 
files=(*) 
nfile=$(("${#files[@]}" - ndir)) 
echo "files=$nfile, directories=$ndir" 

これは動作します。

  • dirs=(*/)は、ディレクトリの名前の配列を作成します。

  • ndir="${#dirs[@]}"は、ディレクトリの数をカウントします。

  • files=(*)は、すべてのファイルとディレクトリの名前の配列を作成します。

  • nfile=$(("${#files[@]}" - ndir))は、要素数をfilesとし、そこからディレクトリ数を差し引いてファイル数を計算します。

  • echo "files=$nfile, directories=$ndir"が結果を出力します。

これは、配列をサポートするbashのようなシェルでのみ機能します。多くのシステムでは、shdashであり、配列をサポートしていません。したがって、このスクリプトを実行するときはbash scriptを使用してください。

関連する問題