[Linux]ディレクトリとサブディレクトリのファイル数をカウントする

2021年6月16日水曜日

Linux

Linuxのディレクトリ内のファイル数をカウントするコマンドや、
サブディレクトリ内のファイル数も含めて再帰的にカウントするコマンドを紹介します


結論

カレントディレクトリのファイル数を出力する場合は下記コマンドを実行します
$ ls -UF | grep -v / | wc -l

カレントディレクトリのサブディレクトリ内のファイル数も含めて出力する場合は
下記コマンドを実行します
$ ls -UFR | grep -v "/\|.:\|^\s*$" | wc -l

具体例

下記の通りのディレクトリで実際にファイル数を取得していきます
tempディレクトリにはtxtファイルが5つ、ディレクトリを1つ配置しており
temp_2ディレクトリにはtxtファイルを3つ配置しています
$ tree ./temp
./temp
├── memo_1.txt
├── memo_2.txt
├── memo_3.txt
├── memo_4.txt
├── memo_5.txt
└── temp_2
    ├── memo_6.txt
    ├── memo_7.txt
    └── memo_8.txt

tempディレクトリ直下でファイル数を取得します
$ cd temp
$ ls -UF | grep -v / | wc -l
5

temp直下のファイル数を取得できました
この時サブディレクトリのファイル数は含まれていません

次にサブディレクトリ内のファイル数を含めたファイル数を取得します
$ cd temp
$ ls -UFR | grep -v "/\|.:\|^\s*$" | wc -l
8
サブディレクトリのファイル数も含めて取得できました

解説

各コマンドの詳細を解説していきます

lsコマンド

ファイルやディレクトリの情報を表示するコマンドです

以下に今回使用しているオプションを記載します

-U オプション

このオプションはファイルを並び替えることなく、ディレクトリに含まれている要素順で表示します
ディレクトリ内のファイル数が膨大な場合に高速化に繋がります

-R オプション

対象のディレクトリのサブディレクトリの情報も再帰的に表示します
$ ls
memo_1.txt  memo_2.txt  memo_3.txt  memo_4.txt  memo_5.txt  temp_2

# サブディレクトリの情報も取得
$ ls -R
.:
memo_1.txt  memo_2.txt  memo_3.txt  memo_4.txt  memo_5.txt  temp_2

./temp_2:
memo_6.txt  memo_7.txt  memo_8.txt
上記例のようにサブディレクトリ内の情報が表示されます

-F オプション

情報を付加するコマンドです
ディレクトリ名の後に / を、バイナリファイルに * を付加します
$ ls
memo_1.txt  memo_2.txt  memo_3.txt  memo_4.txt  memo_5.txt  temp_2

$ ls -F
memo_1.txt  memo_2.txt  memo_3.txt  memo_4.txt  memo_5.txt  temp_2/
上記のようにディレクトリの後に/が付加されます

grepコマンド

対象となるファイルや出力から文字列を検索するコマンドです

以下に今回使用しているオプションを記載します

-v オプション

対象となるファイルや出力から一致しない文字列を検索します
本記事のコマンドではlsコマンドの出力に対してgrepを使用しています
$ ls -UF
memo_1.txt  memo_2.txt  memo_3.txt  memo_4.txt  memo_5.txt  temp_2/

# "/"を含む文字列を除いた結果を出力
$ ls -UF | grep -v /
memo_1.txt
memo_2.txt
memo_3.txt
memo_4.txt
memo_5.txt
このgrepコマンドは正規表現を使用できます

本記事のサブディレクトリまで含めてファイル数を取得する際の正規表現は下記を意味しています

| はOR検索を意味しています
エスケープを含めて \| と表現します
^\s*$ は行頭から行末まで全て空白であることを意味しています
^ が行頭を
\s が空白文字を
* が0回以上の繰り返しを
$ が行末を意味しています

wcコマンド

ファイルや出力の行数や単語数等を数える(word count)するコマンドです

以下に今回使用しているオプションを記載します

-l オプション

対象となるファイルや出力から改行の数をカウントします
本記事のコマンドではgrepコマンドの出力に対してwcコマンドを使用しています
$ ls -UFR | grep -v "/\|.:\|^\s*$"
memo_1.txt
memo_2.txt
memo_3.txt
memo_4.txt
memo_5.txt
memo_6.txt
memo_7.txt
memo_8.txt

# 上記出力の改行の数をカウント
$ ls -UFR | grep -v "/\|.:\|^\s*$" | wc -l
8

grepに正規表現が含まれるため若干コマンドが複雑になりますが
その代わりにディレクトリ数を含めず正確にファイル数を取得できるメリットがあります

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology