すべてのサブディレクトリのファイル数を報告する方法は?

すべてのサブディレクトリのファイル数を報告する方法は?

すべてのサブディレクトリを確認し、含まれるファイル数を報告する必要があります(追加の再帰なし)。

directoryName1 numberOfFiles
directoryName2 numberOfFiles

ベストアンサー1

これは安全で持ち運び可能な方法で行われます。奇妙なファイル名のために混乱しません。

for f in *; do [ -d ./"$f" ] && find ./"$f" -maxdepth 1 -exec echo \; | wc -l && echo $f; done

まずファイル番号を印刷してから、ディレクトリ名を別の行に印刷します。 OPの形式を維持するには、追加の形式を指定する必要があります。

for f in *; do [ -d ./"$f" ] && find ./"$f" -maxdepth 1 -exec echo \;|wc -l|tr '\n' ' ' && echo $f; done|awk '{print $2"\t"$1}'

興味のある特定のサブディレクトリセットがある場合は、*それをそのサブディレクトリに置き換えることができます。

なぜそんなに安全ですか?(したがって台本にふさわしい)

ファイル名に 。以外の文字を含めることができます/。シェルやコマンドで特別に扱われる文字があります。これにはスペース、改行、ダッシュが含まれます。

このfor f in *構造を使用することは、含まれている内容に関係なくすべてのファイル名を取得する安全な方法です。

ファイル名を変数に入れた後に提供したばかりのオプションを含めると、.filenameがエラーを引き起こすのと同じ問題を回避する必要がありますfind $f。これを避ける方法は、名前の前に使用することです。これは同じ意味を持ちますが、ダッシュで始まらなくなります。$f-testfind./

改行とスペースも問題です。$fファイル名に "hello, buddy" が含まれている場合find ./$f、はいfind ./hello, buddy。存在しないと文句を言い、絶対に見つかりません。これは避けやすいです。変数の周りに引用符を使用します。find./hello,buddy./hello, buddy

最後に、ファイル名に改行を含めることができるため、ファイル名のリストから改行を計算することは効果がありません。改行がある各ファイル名の追加数が得られます。これを回避するには、ファイルリストから改行を数えるのではなく、個々のファイルを表す改行(またはその他の文字)を数えます。これがfindコマンドにsimple-exec echo \;とnotがある理由です-exec echo {} \;。統計ファイルに新しい行を印刷したいです。

おすすめ記事