複数階層にわたるディレクトリ配下で,ファイル名が 数値_任意の文字列 という形式(例:3287_abc.png、3287_xyz.jpg)になっている場合,先頭の数値ごとに何件ファイルが存在するかを確認したいことがある.

例えば以下のような構成の場合,

folder
 ├── 3287_abc.png
 ├── 3287_def.png
 └── sub_folder
             ├── 9872_der.png
             ├── 9871_eer.png
             └── 3287_mno.png

調査結果として

3287_*: 3
9871_*: 1
9872_*: 1

のように,先頭の数値ごとの件数を確認できる.

重複しているプレフィックスのみを抽出する

以下のコマンドを実行する.

1find . -type f | awk -F'/' ' 2{ 3 file = $NF 4 if (match(file, /^[0-9]+_/)) { 5 id = substr(file, RSTART, RLENGTH-1) 6 count[id]++ 7 } 8} 9END { 10 for (i in count) 11 if (count[i] > 1) 12 print i "_*:", count[i] 13}' | sort -n

実行結果例

3287_*: 3

重複しているファイルの一覧も表示する

どのファイルが重複しているかまで確認したい場合は,以下のコマンドを使用する.

1find . -type f | awk -F'/' ' 2{ 3 path = $0 4 file = $NF 5 if (match(file, /^[0-9]+_/)) { 6 id = substr(file, RSTART, RLENGTH-1) 7 count[id]++ 8 files[id] = files[id] "\n " path 9 } 10} 11END { 12 for (i in count) 13 if (count[i] > 1) 14 printf "%s_* (%d files):%s\n\n", i, count[i], files[i] 15}' | sort -n

実行結果例

3287_* (3 files):
  ./3287_abc.png
  ./3287_def.png
  ./f_b/3287_mno.png

ポイント

  • find でサブディレクトリを含めた全ファイルを再帰的に検索する.
  • awk でファイル名の先頭にある 数値_ を抽出する.
  • 同じ数値ごとに件数を集計する.
  • count > 1 の条件を指定することで,重複しているものだけを抽出できる.
  • ディレクトリ階層が深くても,そのまま利用できる.