次の点に関して助けが必要です。
私がディレクトリにあり、このディレクトリ内に別のディレクトリやファイルなどがあるとしましょう。
再帰関数を使用して、そのファイルとサブディレクトリ内のすべてのファイルとディレクトリを計算したいと思います。
wc ... grepまたはfindを使用して問題を解決できることを知っていますが、ここでは最初の再帰関数を実際に使用したいと思います。
これは私がこれまでにしたことですが、うまくいきません。
counting(){
for i in $(ls -a $1)
do
if [ -d $1/$i ];then
let d++
cd $1/$i
counting $i
cd ..
elif [ -f $1/$i ];then
let f++
fi
done
}
counting $1
echo "number of files = $f ; number of directories = $d"
答え1
改善できる事項は次のとおりです(完了は保証されません)。
いいえ解析された出力
ls
。
ファイルまたはディレクトリ名にスペースが含まれると(ほとんどの最新のファイルシステムでは完全に合法的です)、スクリプトは中断されます。
代わりに、シェルのワイルドカード機能を使用してください。shopt -s dotglob # to make the * glob match hidden files (like ls -a) for i in "$1"/*
変数は常に引用されます。
シェルは空白文字(スペース、改行など)を見て、1つのコマンド引数が終わり、別のコマンド引数が始まる場所を決定します。次の例を考えてみましょう。filename="foo bar" touch $filename # gets expanded to `touch foo bar`, so it creates two files named "foo" and "bar" touch "$filename" # gets expanded to `touch "foo bar`", so it creates a single file named "foo bar"
cd
多 すぎるcd $1/$i counting $i # which in turn calls ... ls -a $1
ls
./foo/bar/bar
- これは、構文解析と引用符で囲まれていない変数の場合にディレクトリの内容を一覧表示しようとします./foo/bar
。