Ubuntuのbashからディレクトリをインポートし、ディレクトリ内ls -lah
のファイル数を繰り返し表示するようにしたいと思います。つまり、ディレクトリとサブディレクトリのすべてのファイル数を計算したいと思います。
可能ですか?
答え1
ls
ほとんどのUnixでは、このユーティリティの出力は通常表示にのみ適しているため、ここで使用する要求を無視しました。
以下では、withfind
を使用して、bash
現在のディレクトリの各サブディレクトリにある名前の数を再帰的に計算します。
find . -type d -exec bash -O nullglob -O dotglob -c '
for dirpath do
set -- "$dirpath"/*
printf "%s:\t%d\n" "$dirpath" "$#"
done' bash {} +
これはbash
ディレクトリパス名のバッチとして呼び出され、インラインスクリプトは指定されたバッチを繰り返し、*
各バッチでワイルドカードパターンを展開します。シェルオプションを設定するnullglob
と、dotglob
名前リスト(おそらく非表示)に展開され、その$#
リストの長さになります。
現在の作業ディレクトリの最上位ディレクトリ数だけを希望する場合:
shopt -s globstar nullglob dotglob
for dirpath in */; do
set -- "$dirpath"/**
printf '%s:\t%d\n' "$dirpath" "$#"
done
これ以上使用する必要がないことを除いて、ほぼ同じですfind
。**
再帰を使用して各ディレクトリの下のすべての名前を繰り返し、以前のように結果を表示します。
実際にコードを少し変更して、まったく何もしなくfind
ても最初のコードを再作成できます。各ディレクトリの名前数を再帰的に取得します。
shopt -s globstar nullglob dotglob
for dirpath in **/; do
set -- "$dirpath"/*
printf '%s:\t%d\n' "$dirpath" "$#"
done
ある場所から別の場所にのみ移動したことに注意してください*
。