tìm tệp có khớp thẻ đại diện


Câu trả lời:


83

Điều này không được bao phủ bởi lõi Node. Bạn có thể kiểm tra mô-đun này để biết những gì bạn đang theo đuổi.

Thiết lập

npm i glob

Sử dụng

var glob = require("glob")

// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

5
Mẫu mã sẽ hữu ích.
— Pavlo

3
Nó không phải là tốt hơn. Tốt hơn là thu hút mọi người sử dụng các tài nguyên liên quan đến chủ đề. Trong trường hợp này, hãy học cách sử dụng NPM / npmjs.org.
— Morgan ARR Allen

1
Nó không nhất thiết phải là một thứ Node, tôi cảm thấy tốt hơn là chỉ ra các tài nguyên có thể được sử dụng trong tương lai hơn là chỉ cho ai đó cách thực hiện điều gì đó. Tôi cũng làm như vậy với MDN cho các câu hỏi JS đơn giản.
— Morgan ARR Allen

5
Trong trường hợp bạn đang tìm kiếm một giải pháp đồng bộ thư viện glob đề cập ở trên cũng có một phương pháp đồng bộ github.com/isaacs/node-glob#globsyncpattern-options
— Leon Fedotov

19
@MorganARRAllen Mặc dù tôi đồng ý rằng mọi người nên sử dụng các tài nguyên được liên kết, nhưng đó cũng là một phần của tiêu chuẩn trên Stackoverflow để bao gồm một mẫu về những gì bạn đang mô tả trong câu trả lời của mình. Tôi có xu hướng làm cả hai, như câu trả lời này thực hiện sau khi chỉnh sửa, có cả liên kết cũng như đoạn mã. Rốt cuộc, các liên kết có thể bị phá vỡ theo thời gian.
— Paul

89

Nếu bạn không muốn thêm một phần phụ thuộc mới vào dự án của mình (như glob), bạn có thể sử dụng các hàm js / node đơn giản, như:

var files = fs.readdirSync('C:/tmp').filter(fn => fn.endsWith('.csv'));

Regex có thể giúp ích cho những so sánh phức tạp hơn


11

Nếu hình cầu không hoàn toàn như những gì bạn muốn, hoặc hơi khó hiểu, thì cũng có hình cầu-f . Tài liệu bao gồm nhiều trường hợp sử dụng với các ví dụ.

// sync 
var files = glob.readdirSync('*.js', {});

// async 
glob.readdir('*.js', function(err, files) {
  console.log(files);
});

// stream 
glob.readdirStream('*.js', {})
  .on('data', function(file) {
    console.log(file);
  });

// promise 
glob.readdirPromise('*.js')
  .then(function(files) {
    console.log(file);
  });

0

Chỉ trong trường hợp bạn muốn tìm kiếm tệp bằng regex (đối với các kết quả phù hợp phức tạp), thì hãy xem xét sử dụng tệp-regex , hỗ trợ tìm kiếm đệ quy và kiểm soát đồng thời (để có kết quả nhanh hơn).

Sử dụng mẫu

import FindFiles from 'file-regex'

// This will find all the files with extension .js
// in the given directory
const result = await FindFiles(__dirname, /\.js$/);
console.log(result)

-4

đừng phát minh lại bánh xe, nếu bạn đang sử dụng * nix, lscông cụ có thể dễ dàng làm điều này ( tài liệu api nút )

var options = {
  cwd: process.cwd(),
}
require('child_process')
.exec('ls -1 *.csv', options, function(err, stdout, stderr){
  if(err){ console.log(stderr); throw err };
  // remove any trailing newline, otherwise last element will be "":
  stdout = stdout.replace(/\n$/, '');
  var files = stdout.split('\n');
});

6
Nếu đó là PC Windows thì sao?
— Pavlo

1
tôi chưa bao giờ cố gắng nhưng bạn có thể thử một kết quả tương tự với các cửa sổ dir /Blệnh, bạn cũng có thể cần phải chia trên \r\n, không tích cực
— Plato

19
Tôi cực lực phản đối cách làm này. Việc gọi các công cụ dòng lệnh từ mã chương trình và phân tích cú pháp kết quả sẽ biến thành thảm họa bảo trì. Tôi kế thừa dự án như thế này một lần.
— Pavlo

3
Tôi phản đối downvote; chắc chắn có những trường hợp sử dụng trong đó globhoặc một số mô-đun khác sẽ thích hợp hơn (ví dụ: nếu bạn muốn triển khai trên nhiều nền tảng và không chắc chắn về việc lssẽ hoạt động giống nhau hay không) nhưng tôi không coi câu trả lời của mình là cẩu thả hoặc "rõ ràng hoặc không chính xác một cách nguy hiểm" . "Sử dụng phiếu phản đối của bạn bất cứ khi nào bạn gặp một bài đăng cẩu thả, không tốn nhiều công sức hoặc một câu trả lời rõ ràng và có thể không chính xác một cách nguy hiểm."
— Plato

Đây có thể là một giải pháp thực tế nhưng hoàn toàn không phải là giải pháp. Nó không liên quan đến Node.js.
— MeuhMeuh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.