35

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

// 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は本来よりも少し複雑です。


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

4

4 に答える 4

28

ノードライブラリにグロブはありません。NPMから何かを取得したくない場合は、心配する必要はありません。コードを1行追加するだけです。しかし、私のテストでは、他の回答で提供されているコードはほとんど機能しません。これが私のコードフラグメントで、テストされ、機能し、純粋なネイティブノードと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))
于 2019-02-19T00:47:56.643 に答える
11

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

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

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

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

于 2013-02-17T14:30:28.063 に答える
1

これを行うための非常に簡単な解決策があります。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]);
   }
});
于 2017-01-10T14:54:33.187 に答える
0

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

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

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

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

于 2013-02-17T21:10:45.753 に答える