Node.js - 特定のパターンに一致するすべてのファイルを見つける

特定のディレクトリ内のファイルの中で、特定のパターンに一致するファイルのリストを見つける方法を紹介します。

1. glob() を使った方法

glob(path_pattern, callback)path_pattern に対応するファイルを見つけて callback に結果を渡します。

globがインストールされていない場合は、以下のコマンドで追加できます。

$ npm install glob

globを使用すると、以下のようにパスの下にあるファイルの中にファイル名が.txtで終わるすべてのファイルを見つけることができます。

const glob = require('glob')

glob('/var/*.txt', (err, files) => {
  if (err) {
    return console.error(err);
  }

  files.forEach(file => {
    console.log(file);
  });
})

Output:

/var/test.txt
/var/test2.txt

実行環境で /var パスの下のファイルを確認すると、以下のようなディレクトリとファイルがあります。

$ ls /var
lib  local  lock  log  mail  metrics  opt  run  snap  spool  test.txt  test2.txt  www

1.1 子のすべてのディレクトリとファイルの確認

特定のパスの下のディレクトリのサブディレクトリまで、そのディレクトリの下のすべてのファイルまで確認するには、 /var/**/*.logのように/**/ パターンを追加するだけです。

const glob = require('glob');

glob('/var/**/*.log', (err, files) => {
  if (err) {
    return console.error(err);
  }

  files.forEach(file => {
    console.log(file);
  });
});

Output:

/var/lib/dkms/nvidia/470.141.03/5.11.0-46-generic/x86_64/log/make.log
/var/lib/docker/containers/ef1758c3f211f839e0ba83d31ea038edddd2c0782e978a76f9f83336660cf270/ef1758c3f211f839e0ba83d31ea038edddd2c0782e978a76f9f83336660cf270-json.log
/var/lib/gems/2.7.0/extensions/x86_64-linux/2.7.0/eventmachine-1.2.7/mkmf.log
/var/lib/gems/2.7.0/extensions/x86_64-linux/2.7.0/ffi-1.15.5/mkmf.log
/var/lib/gems/2.7.0/gems/ffi-1.15.5/ext/ffi_c/libffi-x86_64-linux-gnu/config.log
/var/log/alternatives.log
/var/log/apache2/access.log
/var/log/apache2/error.log
/var/log/apache2/other_vhosts_access.log
/var/log/apport.log
/var/log/apt/history.log
/var/log/apt/term.log
/var/log/auth.log
/var/log/boot.log
/var/log/bootstrap.log
/var/log/dist-upgrade/apt.log
/var/log/dpkg.log
/var/log/fontconfig.log
/var/log/gpu-manager-switch.log

2. fs.readdir() を使った方法

fs.readdir(path, callback) で path のサブファイルのリストを取得できます。ファイルのリストを取得し、ファイル名を正規表現でフィルタリングして、特定のパターンのファイルを見つけることができます。

const fs = require('fs');

fs.readdir("/var", (err, files) => {
  if (err) {
    throw err;
  }

  files.filter(file => /.*\.txt/.test(file))
    .forEach(file => {
      console.log(file);
    });
});

Output:

test.txt
test2.txt
codechachaCopyright ©2019 codechacha