nodejs의 폴더 아래에 * .html 확장자로 파일 찾기
src 폴더와 nodejs를 사용하여 모든 하위 폴더에서 모든 * .html 파일을 찾고 싶습니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?
var folder = '/project1/src';
var extension = 'html';
var cb = function(err, results) {
// results is an array of the files with path relative to the folder
console.log(results);
}
// This function is what I am looking for. It has to recursively traverse all sub folders.
findFiles(folder, extension, cb);
많은 개발자가 훌륭하고 테스트 된 솔루션을 가지고 있어야하며 직접 작성하는 것보다 사용하는 것이 좋습니다.
node.js, 재귀 적 단순 함수 :
var path = require('path'), fs=require('fs');
function fromDir(startPath,filter){
//console.log('Starting from dir '+startPath+'/');
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
fromDir(filename,filter); //recurse
}
else if (filename.indexOf(filter)>=0) {
console.log('-- found: ',filename);
};
};
};
fromDir('../LiteScript','.html');
멋지게 만들고 싶다면 RegExp를 추가하고 일반화하려면 콜백을 추가하십시오.
var path = require('path'), fs=require('fs');
function fromDir(startPath,filter,callback){
//console.log('Starting from dir '+startPath+'/');
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
fromDir(filename,filter,callback); //recurse
}
else if (filter.test(filename)) callback(filename);
};
};
fromDir('../LiteScript',/\.html$/,function(filename){
console.log('-- found: ',filename);
});
const glob = require('glob');
glob(__dirname + '/**/*.html', {}, (err, files)=>{
console.log(files)
})
잠깐만 요?! ... 좋아, 아마도 이것은 다른 사람에게도 더 의미가 있습니다.
[ nodejs 7 마음에 들어요 ]
let dirCont = wl.fs.readdirSync( dir );
let files = dirCont.filter( function( elm ) {return elm.match(/.*\.(htm?html)/ig);});
정규식을 사용하여 기본값 등으로 함수에서 설정 한 인수로 만드십시오.
이를 위해 Filehound 를 사용할 수 있습니다 .
예 : / tmp에서 모든 .html 파일 찾기 :
const Filehound = require('filehound');
Filehound.create()
.ext('html')
.paths("/tmp")
.find((err, htmlFiles) => {
if (err) return console.error("handle err", err);
console.log(htmlFiles);
});
자세한 정보 (및 예제)는 https://github.com/nspragg/filehound 문서를 확인 하십시오.
면책 조항 : 저는 저자입니다.
Lucio의 코드를 기반으로 모듈을 만들었습니다. 특정 확장자를 가진 모든 파일과 함께 멀리 반환됩니다. 누군가가 필요로 할 경우를 대비하여 여기에 게시하십시오.
var path = require('path'),
fs = require('fs');
/**
* Find all files recursively in specific folder with specific extension, e.g:
* findFilesInDir('./project/src', '.html') ==> ['./project/src/a.html','./project/src/build/index.html']
* @param {String} startPath Path relative to this file or other file which requires this files
* @param {String} filter Extension name, e.g: '.html'
* @return {Array} Result files with path string in an array
*/
function findFilesInDir(startPath,filter){
var results = [];
if (!fs.existsSync(startPath)){
console.log("no dir ",startPath);
return;
}
var files=fs.readdirSync(startPath);
for(var i=0;i<files.length;i++){
var filename=path.join(startPath,files[i]);
var stat = fs.lstatSync(filename);
if (stat.isDirectory()){
results = results.concat(findFilesInDir(filename,filter)); //recurse
}
else if (filename.indexOf(filter)>=0) {
console.log('-- found: ',filename);
results.push(filename);
}
}
return results;
}
module.exports = findFilesInDir;
위의 답변을 살펴보고 나를 위해 작동하는이 버전을 함께 혼합했습니다.
function getFilesFromPath(path, extension) {
let dir = fs.readdirSync( path );
return dir.filter( elm => elm.match(new RegExp(`.*\.(${extension})`, 'ig')));
}
console.log(getFilesFromPath("./testdata", ".txt"));
이 테스트는 경로에있는 폴더에있는 파일에서 파일 이름 배열을 반환합니다 ./testdata
. 노드 버전 8.11.3에서 작업 중입니다.
다음 코드는 ./ 내부에서 재귀 검색을 수행하고 (적절하게 변경) .html로 끝나는 절대 파일 이름 배열을 반환합니다.
var fs = require('fs');
var path = require('path');
var searchRecursive = function(dir, pattern) {
// This is where we store pattern matches of all files inside the directory
var results = [];
// Read contents of directory
fs.readdirSync(dir).forEach(function (dirInner) {
// Obtain absolute path
dirInner = path.resolve(dir, dirInner);
// Get stats to determine if path is a directory or a file
var stat = fs.statSync(dirInner);
// If path is a directory, scan it and combine results
if (stat.isDirectory()) {
results = results.concat(searchRecursive(dirInner, pattern));
}
// If path is a file and ends with pattern then push it onto results
if (stat.isFile() && dirInner.endsWith(pattern)) {
results.push(dirInner);
}
});
return results;
};
var files = searchRecursive('./', '.html'); // replace dir and pattern
// as you seem fit
console.log(files);
이를 위해 OS 도움말을 사용할 수 있습니다. 다음은 크로스 플랫폼 솔루션입니다.
1. 노호 기능 사용 ls
및 dir
및 재귀 적으로 검색하지 않습니다하지만 상대 경로가
var exec = require('child_process').exec;
function findFiles(folder,extension,cb){
var command = "";
if(/^win/.test(process.platform)){
command = "dir /B "+folder+"\\*."+extension;
}else{
command = "ls -1 "+folder+"/*."+extension;
}
exec(command,function(err,stdout,stderr){
if(err)
return cb(err,null);
//get rid of \r from windows
stdout = stdout.replace(/\r/g,"");
var files = stdout.split("\n");
//remove last entry because it is empty
files.splice(-1,1);
cb(err,files);
});
}
findFiles("folderName","html",function(err,files){
console.log("files:",files);
})
2. 벨로우즈 기능은 및를 사용 find
하여 dir
재귀 적으로 검색하지만 윈도우에서는 절대 경로가 있습니다.
var exec = require('child_process').exec;
function findFiles(folder,extension,cb){
var command = "";
if(/^win/.test(process.platform)){
command = "dir /B /s "+folder+"\\*."+extension;
}else{
command = 'find '+folder+' -name "*.'+extension+'"'
}
exec(command,function(err,stdout,stderr){
if(err)
return cb(err,null);
//get rid of \r from windows
stdout = stdout.replace(/\r/g,"");
var files = stdout.split("\n");
//remove last entry because it is empty
files.splice(-1,1);
cb(err,files);
});
}
findFiles("folder","html",function(err,files){
console.log("files:",files);
})
for-loop 대신 map을 사용하는 내 두 펜스
var path = require('path'), fs = require('fs');
var findFiles = function(folder, pattern = /.*/, callback) {
var flist = [];
fs.readdirSync(folder).map(function(e){
var fname = path.join(folder, e);
var fstat = fs.lstatSync(fname);
if (fstat.isDirectory()) {
// don't want to produce a new array with concat
Array.prototype.push.apply(flist, findFiles(fname, pattern, callback));
} else {
if (pattern.test(fname)) {
flist.push(fname);
if (callback) {
callback(fname);
}
}
}
});
return flist;
};
// HTML files
var html_files = findFiles(myPath, /\.html$/, function(o) { console.log('look what we have found : ' + o} );
// All files
var all_files = findFiles(myPath);
방금 응용 프로그램을 차단할 수있는 sync fs 메서드를 사용하고 있습니다. 여기에 async 및 q를 사용하는 약속 기반 비동기 방식 이 있습니다. START = / myfolder FILTER = ". jpg"node myfile.js로 실행할 수 있습니다. myfile.js라는 파일에 다음 코드를 넣었다고 가정합니다.
Q = require("q")
async = require("async")
path = require("path")
fs = require("fs")
function findFiles(startPath, filter, files){
var deferred;
deferred = Q.defer(); //main deferred
//read directory
Q.nfcall(fs.readdir, startPath).then(function(list) {
var ideferred = Q.defer(); //inner deferred for resolve of async each
//async crawling through dir
async.each(list, function(item, done) {
//stat current item in dirlist
return Q.nfcall(fs.stat, path.join(startPath, item))
.then(function(stat) {
//check if item is a directory
if (stat.isDirectory()) {
//recursive!! find files in subdirectory
return findFiles(path.join(startPath, item), filter, files)
.catch(function(error){
console.log("could not read path: " + error.toString());
})
.finally(function() {
//resolve async job after promise of subprocess of finding files has been resolved
return done();
});
//check if item is a file, that matches the filter and add it to files array
} else if (item.indexOf(filter) >= 0) {
files.push(path.join(startPath, item));
return done();
//file is no directory and does not match the filefilter -> don't do anything
} else {
return done();
}
})
.catch(function(error){
ideferred.reject("Could not stat: " + error.toString());
});
}, function() {
return ideferred.resolve(); //async each has finished, so resolve inner deferred
});
return ideferred.promise;
}).then(function() {
//here you could do anything with the files of this recursion step (otherwise you would only need ONE deferred)
return deferred.resolve(files); //resolve main deferred
}).catch(function(error) {
deferred.reject("Could not read dir: " + error.toString());
return
});
return deferred.promise;
}
findFiles(process.env.START, process.env.FILTER, [])
.then(function(files){
console.log(files);
})
.catch(function(error){
console.log("Problem finding files: " + error);
})
파일 정규식 살펴보기
let findFiles = require('file-regex')
let pattern = '\.js'
findFiles(__dirname, pattern, (err, files) => {
console.log(files);
})
위의 스 니펫은 js
현재 디렉토리의 모든 파일을 인쇄합니다 .
이 모듈을 통해 목표를 달성 할 수 있습니다.
It allows you to have a json object or a string representing the tree of the given path. It has also callback when files are found and several filters and options.
This is the code:
const dree = require('dree');
const files = [];
const fileCb = function(file) {
files.push(file.name);
}
dree.scan('path', { extensions: ['txt', 'html'] }, fileCb);
console.log(files); //Print all txt and html files found
Can't add a comment because of reputation, but notice the following:
Using fs.readdir or node-glob to find a wildcard set of files in a folder of 500,000 files took ~2s. Using exec with DIR took ~0.05s (non recursive) or ~0.45s (recursive). (I was looking for ~14 files matching my pattern in a single directory).
So far, I have failed to find any nodejs implementation which uses low level OS wildcard searching for efficiency. But the above DIR/ls based code works wonderfully in windows in terms of efficiency. linux find, however, will likely be very slow for large directories.
Old post but ES6 now handles this out of the box with the includes
method.
let files = ['file.json', 'other.js'];
let jsonFiles = files.filter(file => file.includes('.json'));
console.log("Files: ", jsonFiles) ==> //file.json
ReferenceURL : https://stackoverflow.com/questions/25460574/find-files-by-extension-html-under-a-folder-in-nodejs
'IT story' 카테고리의 다른 글
SQL 내부 조인 둘 이상의 테이블 (0) | 2020.12.28 |
---|---|
부트 스트랩 3 : 작은 화면 크기에서만 열 밀기 / 당기기 (0) | 2020.12.28 |
데코레이터 패턴을 언제 사용합니까? (0) | 2020.12.28 |
아무데도 가지 않는 링크를 어떻게 만드나요 (0) | 2020.12.28 |
H2DB에서 MySql 에서처럼 SQL 덤프를 얻는 방법은 무엇입니까? (0) | 2020.12.28 |