Javascript 节点JS仅复制某些文件

Javascript 节点JS仅复制某些文件,javascript,node.js,npm,fs,Javascript,Node.js,Npm,Fs,我有一个如下的输入目录: resouces ├── a.avi ├── b.mp3 ├── c.pdf ├── d.png └── ... 我正在尝试生成以下内容: resouces ├── audio └── *.mp3 ├── video └── *.avi └── ... 我正在使用fs额外的npm模块。这是我的代码: fse.ensureDir(resourcesOutputDirectory, (error) => { if (error) {

我有一个如下的输入目录:

resouces
├── a.avi
├── b.mp3
├── c.pdf
├── d.png
└── ...
我正在尝试生成以下内容:

resouces
├── audio
    └── *.mp3
├── video
    └── *.avi
└── ...
我正在使用fs额外的npm模块。这是我的代码:

fse.ensureDir(resourcesOutputDirectory, (error) => {
    if (error) {
        console.err("An error ocurred creating the resources directory " + error.message);
    } else {
        fse.copy(resourcesInputDirectory, resourcesOutputDirectory, "/**/*.mp3", (err) => {
            if (err) {
                console.err("An error ocurred moving resource directory to XML exported directory " + err.message);
            } else {
                console.log("Files has been succesfully copied");
            }
         });
     }
});
我不知道如何正确地使用filter选项(copy调用中的第三个参数)只将某些文件复制到我的输出目录

提前感谢

看起来您不能使用globs(就像您在示例中所做的那样)。可以使用返回布尔值的函数,也可以使用正则表达式

例如,如果你想匹配所有MP3或AVI,那么你可以这样做

fse.copy(inDir, outDir, /.*(.mp3|.avi)$/, (err) => { })
我终于明白了:

正如@Jivings所说,我只需要一个正则表达式作为过滤器。但是,问题是来自fse的复制方法使用了ncp,而且它现在似乎有一个过滤器的bug。使用copySync可以工作。

使用此选项可以有选择地从文件夹复制文件,并提供特定的输出名称

const fs=require('fs-extra');
常量文件夹=[
{
路径:“./build/static/css”,
正则表达式:/^(main)。[\w]*.css$/,
outputFile:“../public pages/style/sme.css”
},
{
路径:'./build/static/js',
正则表达式:/^(main)。[\w]*.js$/,
outputFile:“../public pages/js/sme.js”
}
];
/*
下面的代码将匹配regex模式的文件从./build/static/css复制到输出文件指定的新位置
*/
folders.forEach(folder=>{
fs.readdirSync(folder.path).forEach(文件=>{
if(folder.regex.test(文件)){
log(`copying file${file}`);
fs.copy(`${folder.path}/${file}`,folder.outputFile)
。然后(()=>console.log('success!'))
.catch(err=>console.error(err));
}
});

});
阅读
fse
文档让我相信,尽管文档中的示例显然是错误的,但您应该放置一个函数,当您想要复制文件时返回
true
,而不是
false
。像
(file)=>{return(file.endsWith('.mp3');}
这是我的第一种方法。但它没有复制任何内容。请尝试{filter:{test://.(.mp3 |.avi)$/}},如文档所述:filter:Function或RegExp用于筛选复制的文件。如果为Function,则返回true以包含,返回false以排除。如果为RegExp,则返回与Function相同的值,其中filter为filter.test。但它不起作用:(