私はWin10コンピュータで作業していますが、通常はGitbashまたはLinuxサブシステムで作業しています。
指定されたディレクトリのすべてのサブディレクトリにあるファイル数を取得しようとしています。
同様の質問です。すべてのサブディレクトリのファイル数を報告する方法は?ただし、違いは、すべてのサブディレクトリにわたって一定数のレベルを持つのではなく、次のようなものがあることです。
Dir1/sub1
Dir1/sub1/subsub1
Dir1/sub2
Dir1/sub3/subsub3/subsubsub3
頑張った
shopt -s dotglob; for dir in */; do all=("$dir"/*); echo "$dir: ${#all[@]}"; done
検索するレベル数の調整(*/、*/*/*など)
しかし、実際に欲しいものを得ることはできません。たとえば、次のようになります。
Dir1/sub1: Number of files
Dir1/sub2: Number of files
Dir1/sub3: Number of files
ベストアンサー1
#!/bin/bash
shopt -s dotglob nullglob
topdir='./Dir1'
for subdir in "$topdir"/*/; do
find "$subdir" -type f -exec echo . \; |
printf '%s: %d\n' "${subdir%/}" "$( wc -l )"
done
この小さなbash
スクリプトは、サブディレクトリのパス名のリスト$topdir
と、各サブディレクトリ(どこでも)で見つかった一般的なファイルの数を出力します。
このスクリプトはすべてのサブディレクトリを繰り返し、$topdir
各サブディレクトリに対してfind
コマンドを実行します。
find "$subdir" -type f -exec echo . \;
で見つかった通常のファイルごとに空白行に点が出力されます$subdir
。計算が簡単なので、ポイントを出力します(ファイル名には改行文字を含めることができます)。
このポイントは次に接続されます。
printf '%s: %d\n' "${subdir%/}" "$( wc -l )"
ここでは、printf
出力形式を指定するために使用されます。サブディレクトリパス(最後のスラッシュを削除)とファイル数を使用します。
ファイル数はwc -l
パイプのポイントを計算しますfind
(厳密に言えば、ポイントは計算せずに改行を計算します)。printf
標準入力ストリーム自体を読み取らないので消費されますwc -l
。
最初とnullglob
シェルdotglob
オプションを設定すると、サブディレクトリなしで$topdir
(withなど)、ループ全体をスキップでき、nullglob
下に隠されたディレクトリ名も含めることができます(withなど)。$topdir
dotglob
変更して
topdir='./Dir1'
入力する
topdir=$1
スクリプトにディレクトリパスを唯一のコマンドライン引数として使用させることができます。
find
もう少し複雑なものに変更すると、速度を大幅に向上させることができます。
find "$subdir" -type f -exec sh -c 'for pathname do echo .; done' sh {} +
(残りのループはそのままにしておく必要があります。)これは、echo
各ファイルではなく、見つかったファイルの配置に対して非常に小さなインラインシェルスクリプトを実行します。これは〜になりますたくさんecho
Fasterはシェルに組み込まれたコマンドと見なされますsh
。 (これを保証するには、sh -c
に変更する必要があります。)を使用すると、各ファイルに対してゆっくりと実行されます。bash -c
-exec echo . \;
find
/bin/echo