Node.js でディレクトリを探索する:ワイルドカードマッチングの応用例
Node.js でワイルドカードマッチングを使用したファイル検索
まず、glob
モジュールをインストールします。
npm install glob
次に、以下のコードでファイルを検索できます。
const glob = require('glob');
glob('path/to/files/*.txt', (err, files) => {
if (err) {
console.error(err);
return;
}
console.log(files);
});
このコードは、path/to/files
ディレクトリ内のすべての .txt
ファイルを検索します。
ワイルドカードを使用して、より複雑な検索を実行することもできます。
*
: 任意の数の文字にマッチします。[...]:
指定された文字のいずれかにマッチします。{a,b,c}
:a
、b
、またはc
のいずれかにマッチします。(pattern1|pattern2)
:pattern1
またはpattern2
のいずれかにマッチします。
glob('path/to/files/*.{txt,js}', (err, files) => {
if (err) {
console.error(err);
return;
}
console.log(files);
});
詳細については、glob
モジュールのドキュメントを参照してください: https://www.npmjs.com/package/glob
応用例
- 特定の拡張子のファイルをすべて削除する
- 特定の条件に合致するファイルをすべて処理する
- 特定のフォルダ内のすべてのファイルをバックアップする
サンプルコード:ディレクトリ内のすべての .txt ファイルを検索して内容を出力
const glob = require('glob');
const fs = require('fs');
glob('path/to/files/*.txt', (err, files) => {
if (err) {
console.error(err);
return;
}
for (const file of files) {
fs.readFile(file, 'utf8', (err, content) => {
if (err) {
console.error(err);
return;
}
console.log(file + ':');
console.log(content);
});
}
});
このコードは、まず glob
モジュールを使用して path/to/files
ディレクトリ内のすべての .txt
ファイルのリストを取得します。次に、fs
モジュールを使用して各ファイルの内容を読み込み、コンソールに出力します。
応用例
このコードを応用して、以下のことができます。
- 特定の文字列を含むファイルを検索して内容を出力する
- ファイルを別の形式に変換して保存する
- ファイルの統計情報を収集する
注意点
- このコードは、ファイルシステム内のすべてのファイルを検索する可能性があります。大量のファイルがある場合は、パフォーマンスが低下する可能性があります。
- ファイルの内容を読み込む前に、ファイルへのアクセス許可があることを確認してください。
- エラー処理を適切に行うようにしてください。
async/await
を使用してコードを非同期にすることができます。Promise.all()
を使用して、複数のファイルを同時に処理することができます。
Node.js でワイルドカードマッチングを使用したファイル検索:その他の方法
fs-extra
モジュールは、glob
モジュールのラッパーであり、より多くの機能を提供します。
const fsExtra = require('fs-extra');
fsExtra.readdirSync('path/to/files').forEach(file => {
if (file.match(/\.txt$/)) {
const content = fsExtra.readFileSync(`path/to/files/${file}`, 'utf8');
console.log(file + ':');
console.log(content);
}
});
このコードは、fs-extra
モジュールの readdirSync()
メソッドを使用して path/to/files
ディレクトリ内のすべてのファイルのリストを取得します。次に、各ファイル名に対して .txt
のパターンにマッチングするかどうかを確認します。マッチングする場合は、readFileSync()
メソッドを使用してファイルの内容を読み込み、コンソールに出力します。
lodash
モジュールは、さまざまなユーティリティ関数を提供するライブラリです。その中には、ワイルドカードマッチングに使用できる matches()
関数もあります。
const _ = require('lodash');
const files = fs.readdirSync('path/to/files');
_.filter(files, file => file.match(/\.txt$/)).forEach(file => {
const content = fs.readFileSync(`path/to/files/${file}`, 'utf8');
console.log(file + ':');
console.log(content);
});
このコードは、lodash
モジュールの filter()
メソッドを使用して、path/to/files
ディレクトリ内のすべての .txt
ファイルを抽出します。matches()
関数は、ファイル名に対して .txt
のパターンにマッチングするかどうかを確認します。マッチングするファイルは、forEach()
メソッドを使用して処理されます。
カスタム関数
ワイルドカードマッチングを行うカスタム関数を作成することもできます。
function matchWildcard(filename, pattern) {
const regex = new RegExp(pattern.replace(/\*/g, '.*'));
return regex.test(filename);
}
const files = fs.readdirSync('path/to/files');
files.forEach(file => {
if (matchWildcard(file, '*.txt')) {
const content = fs.readFileSync(`path/to/files/${file}`, 'utf8');
console.log(file + ':');
console.log(content);
}
});
このコードは、matchWildcard()
というカスタム関数を作成します。この関数は、ファイル名とパターンを引数とし、ファイル名がパターンにマッチングするかどうかを返します。matchWildcard()
関数は、RegExp
オブジェクトを使用してパターンを正規表現に変換します。test()
メソッドを使用して、正規表現がファイル名にマッチングするかどうかを確認します。
- シンプルさ:
glob
モジュールは最もシンプルで、使いやすいため、初心者におすすめです。 - 柔軟性: カスタム関数は、最も柔軟性があり、複雑なパターンマッチングに使用できます。
注意点
- 上記のコードはあくまで例であり、ニーズに合わせて変更する必要があります。
node.js