サブディレクトリ Bash のファイル数を報告する

サブディレクトリ Bash のファイル数を報告する

私は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など)。$topdirdotglob

変更して

topdir='./Dir1'

入力する

topdir=$1

スクリプトにディレクトリパスを唯一のコマンドライン引数として使用させることができます。

findもう少し複雑なものに変更すると、速度を大幅に向上させることができます。

find "$subdir" -type f -exec sh -c 'for pathname do echo .; done' sh {} +

(残りのループはそのままにしておく必要があります。)これは、echo各ファイルではなく、見つかったファイルの配置に対して非常に小さなインラインシェルスクリプトを実行します。これは〜になりますたくさんechoFasterはシェルに組み込まれたコマンドと見なされますsh。 (これを保証するには、sh -cに変更する必要があります。)を使用すると、各ファイルに対してゆっくりと実行されます。bash -c-exec echo . \;find/bin/echo

おすすめ記事