1. 概要

Linuxシステムの各ディレクトリにあるファイルの数を数える必要がある場合があります。 この問題を解決するための単一のコマンドはありません。 ただし、ほとんどのLinuxディストリビューションでデフォルトで使用できるいくつかの基本的なコマンドを組み合わせることで解決策を見つけることができます。

このチュートリアルでは、各ディレクトリ内のファイル数をカウントするためのいくつかのソリューションについて説明します。

2. 問題

この例では、具体的には、3つのサブディレクトリを含むディレクトリを見てみましょう。

$ ls
Assignments Conference Projects

各サブディレクトリには、ファイルと、ファイルを含む追加のディレクトリが含まれています。

$ ls *
Assignments:
1.txt  2.txt  3.txt  directory_1  directory_2

Conference:
1.txt  2.txt directory_3

Projects:
1.txt  2.txt  3.txt  directory_4  directory_5

ご覧のとおり、 Assignments ディレクトリに5つのファイル、 Conference ディレクトリに3つのファイル、Projectsディレクトリに5つのファイルがあります。

他のサブディレクトリの内容も表示してみましょう。

Assignments /directory_1およびAssignments/ directory_2 には、次のファイルがあります。

$ ls Assignments/ *
directory_1:
1.txt    2.txt    3.txt    4.txt

directory_2:
1.txt    2.txt    3.txt

Conference / directory_3 には、次のファイルがあります。

$ ls Conference/ *
directory_3:
1.txt    2.txt    3.txt

最後に、 Projects /directory_4およびProjects/ directory_5 には、次のファイルがあります。

$ ls Projects/ *
directory_4:
1.txt    2.txt    3.txt

directory_5:
1.txt    2.txt    3.txt    4.txt

すべてをまとめると、全体的な出力は次のようになると予想されます。

5 Assignments
  4 in ./Assignments/directory_1
  3 in ./Assignments/directory_2
3 Conference
  1 in ./Conference/directory_3
5 Projects
  3 in ./Projects/directory_4
  4 in ./Projects/directory_5

これを念頭に置いて、これを実行するために必要なコマンドを調べてみましょう。

3. findを使用する

Linuxのfindコマンドは、ディレクトリ階層内のファイルとディレクトリを検索する柔軟で強力なツールです。実行可能ファイル、空のファイル、他のユーザーが所有するファイル、さらには特定の拡張子を持つファイルを検索できます。

find コマンドはデフォルトで再帰的であり、正規表現パターンを使用して、ファイルとディレクトリ、およびそれぞれのアクセス日または変更日を一覧表示できます。

まず、 find コマンドを使用して、現在の作業ディレクトリ内のすべてのディレクトリとサブディレクトリを一覧表示する方法を見てみましょう。

$ find . -type d -print0
../Assignments./Assignments/directory_1./Assignments/directory_2./Conference./Conference/directory_3./Projects./Projects/directory_4./Projects/directory_5

ここでは、「」記号を使用して、現在の作業ディレクトリをターゲットにしています。 次に、-type d オプションを使用して、すべてのディレクトリを検索し、それらの相対パスを出力します。 -print0 オプションを使用して、結果を1行で出力しています。

次に、出力を while ループにパイプして、各ディレクトリ内のファイルの数をカウントします。

$ find . -type d -print0 | while read -d "" -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done

このコマンドを実行すると、次の出力が得られます。

    3 files in directory .
    5 files in directory ./Assignments
    4 files in directory ./Assignments/directory_1
    3 files in directory ./Assignments/directory_2
    3 files in directory ./Conference
    1 files in directory ./Conference/directory_3
    5 files in directory ./Projects
    3 files in directory ./Projects/directory_4
    4 files in directory ./Projects/directory_5

find コマンドからの出力は、ディレクトリ名を区切り文字( -d [ X175X])オプション。

次に、-rオプションを使用して、円記号をそのまま扱います。 バックスラッシュ文字は、通常、エスケープ文字として使用されます。 各ディレクトリ名には円記号が含まれているため、これは重要です。

最後に、 dir という名前の変数を作成して、各ディレクトリ名を追跡し、各ディレクトリ内のファイルの数をカウントします。

このメソッドは、指定されたディレクトリ階層内にあるレベルに関係なく、各ディレクトリおよびサブディレクトリ内のすべてのファイルをカウントします。

4. awkを使用する

awk コマンドは、テキストファイルを処理し、そのデータに基づいてレポートを生成するために通常使用される強力なLinuxツールです。

awk を使用して、各ディレクトリおよびサブディレクトリ内のファイルの総数を調べてみましょう。 ただし、ファイルの数を正確にカウントするには、find、grep、およびwcコマンドを使用してパイプする必要があります

$ find . -type d | awk '{print "echo -n \""$0" \";ls -l "$0" | grep -v total | wc -l" }' | sh

このコマンドを実行すると、次の出力が得られます。

. 3
./Assignments 5
./Assignments/directory_1 4
./Assignments/directory_2 3
./Conference 3
./Conference/directory_3 1
./Projects 5
./Projects/directory_4 3
./Projects/directory_5 4

find コマンドは、現在の作業ディレクトリ内のすべてのディレクトリとサブディレクトリのリストを返します。 出力をawkコマンドにパイプします。ここで、すべてのファイル名とディレクトリ名を改行で区切って一覧表示して出力します。

最後に、出力を grep -v total コマンドにパイプ処理します。このコマンドは、一致を反転し、wcコマンドは行数をカウントします。 カウントされる行数は、そのディレクトリ内のファイル数を表します。

このメソッドは、指定されたディレクトリ階層内にあるレベルに関係なく、すべてのディレクトリとサブディレクトリ内のファイルもスキャンします。 このアプローチは3つの異なるコマンドを介して出力を渡すため、最初の方法よりも遅くなる傾向があります。

5. 結論

この記事では、特定のディレクトリ階層内の各ディレクトリ内のファイルの総数をカウントするためのいくつかの方法について説明しました。

最初の方法では、findコマンドとwhileループを使用して、すべてのディレクトリを読み取り、その中のファイルの数をカウントします。

find awk grep 、およびwcコマンドを使用して問題を解決する別の方法も確認しました。 ターゲットディレクトリに多数のファイルが含まれている場合は、最初の方法の使用を検討する必要があります。