2013-02-17 15 views
20

Chcę usunąć kilka plików z katalogu, dopasowując wyrażenie regularne. Coś takiego:Usunąć (odłączyć) pliki pasujące do wyrażeń regularnych

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

Od unlink nie obsługuje regexes, używam tego zamiast:

var fs = require('fs'); 

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

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

który działa, ale IMO jest trochę bardziej skomplikowane niż powinny .


Czy istnieje lepszy wbudowany sposób usuwania plików pasujących do wyrażenia regularnego (lub nawet po prostu używania symboli wieloznacznych)?

+2

Wydaje się być uzasadnione. Co sprawia, że ​​wydaje się zbyt skomplikowane? – loganfsmyth

+2

@loganfsmyth - Ponieważ ja * chcę * to być prostsze? :) –

+4

Dlaczego spadamy? –

Odpowiedz

9

Możesz zajrzeć na glob https://npmjs.org/package/glob

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

glob wewnętrznie używa minimatch. Działa poprzez konwertowanie wyrażeń globalnych do obiektów JavaScript RegExp. https://github.com/isaacs/minimatch

Możesz robić, co chcesz, z dopasowanymi plikami w wywołaniu zwrotnym (lub w przypadku globSync zwróconego obiektu).

+0

+1 Dziękuję, ale szukam wbudowanego rozwiązania; Nie wydaje mi się, żeby to usprawiedliwiało wprowadzenie innej zależności od mojego projektu. Jeśli nie ma lepszego rozwiązania natywnego, myślę, że napisany kod będzie mi dobrze służył. –

+1

jako kontynuacja (choć kilka miesięcy później), chcąc robić rzeczy przy użyciu "wbudowanych funkcji" w Node.js nie jest całkiem sposobem Node.js.Jest w pakiecie z 'npm' specjalnie dlatego, że niewiarygodnie łatwo dodać nową bibliotekę za pomocą' npm install glob --save' (w tym przypadku). Dla rozwoju Node.js "przez npm" i "wbudowany" są praktycznie to samo. –

0

Odpowiedź może zależeć od środowiska. Wygląda na to, że działasz na node.js. Szybkie przejrzenie dokumentacji node.js sugeruje, że nie ma "wbudowanego" sposobu, aby to zrobić, tj. Nie ma jednego wywołania funkcji, które zrobi to za Ciebie. Następną najlepszą rzeczą może być niewielka liczba wywołań funkcji. Jak napisałem w swoim komentarzu, nie sądzę, że jest jakikolwiek łatwy sposób, aby zaproponowana odpowiedź była znacznie krótsza, polegając tylko na standardowych wywołaniach funkcji node.js. Oznacza to, że gdybym był w twoich butach, podążałbym za rozwiązaniem, które już zasugerowałeś (choć nieco wyczyszczone).

Jedną z alternatyw jest, aby przejść do powłoki, np

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

Osobiście zdecydowanie wolę swoją oferowanego rozwiązania nad tym bełkot, ale może jesteś strzelanie do czegoś innego.

1

Mam bardzo proste rozwiązanie, aby to zrobić. Czytaj katalog w pliku node.js za pomocą interfejsu API fs.readdir. To da tablicę wszystkich plików w katalogu. Gdy już masz tę macierz, iteruj ją za pomocą pętli for, zastosuj wyrażenie regularne. Poniższy kod usunie wszystkie pliki zaczynające się od "en" i rozszerzenie ".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]); 
    } 
}); 
+3

Czym to się różni od kodu w pytaniu? –

Powiązane problemy