n番目のサブディレクトリの深さとファイル数にアクセスする

n番目のサブディレクトリの深さとファイル数にアクセスする

cdコマンドとlsを使用して、UNIXシステムのツリーをルート "/"で始まる2つのサブディレクトリの深さに設定します。ファイルまたはディレクトリの数が20より大きい場合、ファイルまたはサブディレクトリの数だけが指定されます。

これまで私は次のことを試しました。

cd /../.. | ls -l | wc -l

しかし、これが私の要件を満たすかどうかはわかりません。トイレを知っています。ファイル数を計算できますが、不明です。 cd/../../なぜなら2階下に降りていくようです。まあ、混乱しているようです。

答え1

あなたの注文は何の意味もありません。まず、cd /../..と同じですcd /。つまり、現在の作業ディレクトリをディレクトリ階層の最上位ディレクトリに変更します。第二に、cd出力は生成されないので、次にパイプされます。何もない良いことはないでしょう。

第三に、ls -l現在のディレクトリのエントリ(名前)のリストが作成されます。wc -l以下を使用して数量を計算しています。ワイヤー出力からls -l。この数は、ヘッダーls -lの種類が出力されるため、任意のディレクトリ内の実際のディレクトリエントリの数より少なくとも1つ多いことになります(BSDはlsこれを実行しません)。ディレクトリにありますが、GNUはls常にこれを行います)。 ls -l〜するいいえ隠されたファイル名が一覧表示され(にパイプされるとwc -l)生成されます。複数行ファイル名に改行が含まれるファイルの場合。

lsディレクトリのリストを見ること(目で)以外の目的では使用しないでください。wc -l計算にのみ使用してください。ワイヤー。ファイルの数を数えるよりスマートで迅速な方法があります。

関連:


すべての2番目のレベルのサブディレクトリのディレクトリエントリ(名前)の数を一覧表示するには、次のようにbash使用します。

shopt -s nullglob dotglob

for dirpath in /*/*/; do
    set -- "$dirpath"/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

これはすべてのセカンダリディレクトリで繰り返されます。各ディレクトリに対して、*ディレクトリのワイルドカードパターンを展開し、位置引数を結果名に設定します。これを行うと、特殊変数に$#位置パラメータ(ディレクトリの名前)の数が含まれます。次に、その数と一緒にディレクトリパス名を印刷します。

nullglobdotglobまず、隠された名前を正しく計算し、空のディレクトリの正しい数(0)を取得し、シェルオプションを設定します。

レベル2の各サブディレクトリを再帰的に計算しますか?

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

globstarのシェルオプションを使用すると、サブディレクトリと「再帰的に」一致するパターンをbash使用できます。**

20個以上の項目を含む項目のみを一覧表示します(ここでは、各サブディレクトリで名前を再帰的に計算する上記の2番目のバリエーションを使用します)。

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    if [[ $# -ge 20 ]]; then
        printf '%d\t%s\n' "$#" "$dirpath"
    fi
done

関連情報