8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

bash でディレクトリ内のファイル数を取得したい【大量のファイル数カウント】

Last updated at Posted at 2019-08-24

特定ディレクトリ内の大量のファイルの数を知りたい

数万ファイルあるためか du コマンドでは遅いので、なるべく速く調べられないか。

ここ最近の Qiita 記事で「bash ファイル数 ディレクトリ内」でググってもタイトルからヒットしなかったので、自分のググラビリティとして。

TL; DR (今北産業)

  1. カレント・ディレクトリ内のファイル数一覧

    ls -p -U1 | grep -v / | wc -l
    
  2. 指定したディレクトリ内のファイル数一覧

    # /root/data の場合
    ls -p -U1 /root/data | grep -v / | wc -l
    
  3. 応用(指定したディレクトリ内のファイル数を表示する)

    bashサンプル
    #!/bin/bash
    
    list_dir=(
      '/root/data'
      '/usr/me/data'
      '/usr/me/huge/data'
    )
    
    for path_dir in ${list_dir[@]}; do
      echo 'Path:' $path_dir ' Files:' $(ls -p -U1 $path_dir | grep -v / | wc -l);
    done
    

TS; DR

ls -p -U1 | grep -v / | wc -l
  • ls:一覧表示
  • -p:ディレクトリの場合はファイル名の末尾に / を追加
  • -U1:ソートさせない(ファイルが大量なのでソートさせると遅いため)
  • | grep -v /:パイプから受け取ったディレクトリ(/付きのファイル名)を除外
  • | wc -l:パイプから受け取った行数をカウント

所感と経緯

機械学習でディレクトリ内に設置した大量のファイルをカウントする必要があったのです。下手に lstree しようもんなら、鉄砲玉で帰ってきやしません。

今までカレントディレクトリ内のファイル数をカウントする場合 ls -U1 | wc -l としていました。しかし、サブ・ディレクトリが含まれていると、それらもカウントされていることに気づきました。

確かに、ls -U1 だけを実行するとディレクトリも渡されています。wc コマンドにパイプ渡しする前にディレクトリだけ除外できればいいのですが、ls コマンドに -p オプションを付けてもファイル名の末尾に / と付くだけでした。

悩み始めたのでググってみたところ「grep/ 付きのファイルを -v で除外すればいい」という情報を得て、なんたるちあ。簡単なことでした。

ちなみに ls コマンドの -F オプションを使った方法の情報もあったのですが、遅かったので -p -U1 オプションを使っています。

-pと-Fオプションの速度比較
seq -f "file_%06g" 100000 | xargs touch

time ls -p -U1 | grep -v / | wc -l
time ls -F     | grep -v / | wc -l

# 結果
# real	0m0.060s
# user	0m0.026s
# sys	0m0.047s
# 
# real	0m0.450s
# user	0m0.263s
# sys	0m0.199s

参考文献

8
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?