web-dev-qa-db-ja.com

正規表現に一致するファイルを削除(リンク解除)します

正規表現に一致するいくつかのファイルをディレクトリから削除したい。このようなもの:

// WARNING: not real code
require('fs').unlink(/script\.\d+\.js$/);

unlinkは正規表現をサポートしていないため、代わりにこれを使用しています。

var fs = require('fs');

fs.readdir('.', (error, files) => {
    if (error) throw error;

    files.filter(name => /script\.\d+\.js$/.test(name)).forEach(fs.unlink);
});

これは機能しますが、IMOは本来よりも少し複雑です。


正規表現に一致するファイルを削除する(またはワイルドカードを使用する)ためのより良い組み込みの方法はありますか?

24
Joseph Silber

あなたはグロブを調べることができます https://npmjs.org/package/glob

require("glob").glob("*.txt", function (er, files) { ... });
//or
files = require("glob").globSync("*.txt");

globは内部的にミニマッチを使用します。これは、glob式をJavaScriptRegExpオブジェクトに変換することで機能します。 https://github.com/isaacs/minimatch

コールバック内の一致したファイル(またはglobSyncの場合は返されたオブジェクト)を使用して、好きなことを行うことができます。

10
user568109

いいえ、Nodeライブラリにはグロブはありません。NPMから何かを取得したくない場合は、心配しないでください。コードを1行だけ必要とします。しかし、私のテストではコードをテストしています。他の回答で提供されているものはほとんど機能しません。したがって、テスト済みで機能している純粋なネイティブNodeおよびJS)のコードフラグメントを次に示します。

let fs = require('fs')
const path = './somedirectory/'
let regex = /[.]txt$/
fs.readdirSync(path)
    .filter(f => regex.test(f))
    .map(f => fs.unlinkSync(path + f))
6
david.pfx

これを行うための非常に簡単な解決策があります。 fs.readdir APIを使用して、node.jsのディレクトリを読み取ります。これにより、ディレクトリ内のすべてのファイルの配列が得られます。その配列を取得したら、forループを使用してその配列を反復処理し、正規表現を適用します。以下のコードは、「en」で始まり、拡張子が「.js」のすべてのファイルを削除します。

fs.readdir('.', (err, files)=>{
   for (var i = 0, len = files.length; i < len; i++) {
      var match = files[i].match(/en.*.js/);
      if(match !== null)
          fs.unlink(match[0]);
   }
});
1
Sumit Jindal

答えは環境によって異なります。 node.jsで実行しているようです。 node.jsのドキュメントをざっと読んだところ、これを行うための「組み込み」の方法はないことがわかりました。つまり、これを行う単一の関数呼び出しはありません。次善の策は、少数の関数呼び出しを伴う可能性があります。コメントに書いたように、標準のnode.js関数呼び出しに依存するだけで、提案された回答をはるかに簡潔にする簡単な方法はないと思います。つまり、私があなたの立場にあった場合、私はあなたがすでに提案した解決策を採用します(わずかにクリーンアップされましたが)。

1つの代替手段は、シェルに移動することです。

var exec = require('child_process').exec;
exec('ls | grep "script[[:digit:]]\\\+.js" | xargs rm');

個人的には、このgobbledygookよりも提供されたソリューションを強く望んでいますが、おそらくあなたは別の何かを狙っています。

0
Will Nelson