Copie la carpeta de forma recursiva en node.js

154

¿Existe una manera más fácil de copiar una carpeta y todo su contenido sin tener que hacer manualmente una secuencia de fs.readir, fs.readfile, fs.writefilede forma recursiva?

Me pregunto si me estoy perdiendo una función que idealmente funcionaría así

fs.copy("/path/to/source/folder","/path/to/destination/folder");
lostsource
fuente
3
¿Hay alguna manera de hacer esto sin ningún módulo? ¿Quizás una función recursiva / código snip-it?
Sukima
@Sukima - Mira mi respuesta aquí .
jmort253

Respuestas:

121

Puede usar el módulo ncp . Creo que esto es lo que necesitas

shift66
fuente
2
¡Perfecto! npm install ncpy trabajando en menos de 30 años. Gracias.
Aebsubis
1
La llave inglesa es mejor para mí, porque admite más opciones. Con NCP no puedes resolver enlaces simbólicos, por ejemplo.
Slava Fomin II
3
Como un bono increíble, uno puede usar ncp en scripts de ejecución npm multiplataforma.
Ciantic
Obtuve algunos casos simples donde ncp no va en mi devolución de llamada donde fs-extra lo hace correctamente.
Bumpmann
40
Tenga en cuenta que ncp parece estar sin mantenimiento . fs-extra es probablemente la mejor opción en su lugar.
Chris
74

Este es mi enfoque para resolver este problema sin módulos adicionales. Solo usando el incorporado fsy los pathmódulos.

Nota: Esto utiliza las funciones de lectura / escritura de fs, por lo que no copia ningún metadato (hora de creación, etc.). A partir del nodo 8.5 hay copyFileSyncfunciones disponibles que llaman a las funciones de copia del sistema operativo y, por lo tanto, también copian metadatos. Todavía no los probé, pero debería funcionar simplemente reemplazarlos. (Ver https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags )

var fs = require('fs');
var path = require('path');

function copyFileSync( source, target ) {

    var targetFile = target;

    //if target is a directory a new file with the same name will be created
    if ( fs.existsSync( target ) ) {
        if ( fs.lstatSync( target ).isDirectory() ) {
            targetFile = path.join( target, path.basename( source ) );
        }
    }

    fs.writeFileSync(targetFile, fs.readFileSync(source));
}

function copyFolderRecursiveSync( source, target ) {
    var files = [];

    //check if folder needs to be created or integrated
    var targetFolder = path.join( target, path.basename( source ) );
    if ( !fs.existsSync( targetFolder ) ) {
        fs.mkdirSync( targetFolder );
    }

    //copy
    if ( fs.lstatSync( source ).isDirectory() ) {
        files = fs.readdirSync( source );
        files.forEach( function ( file ) {
            var curSource = path.join( source, file );
            if ( fs.lstatSync( curSource ).isDirectory() ) {
                copyFolderRecursiveSync( curSource, targetFolder );
            } else {
                copyFileSync( curSource, targetFolder );
            }
        } );
    }
}
Simon Zyx
fuente
no copia carpetas si tienen espacio en sus nombres
31415926
Para mí, copia carpetas con espacios en sus nombres. Tal vez fue causado por el error corregido por @victor. Como uso esta función con bastante regularidad (en el estado actual, ya que olvidé actualizar la misma corrección que Victor hizo), estoy bastante seguro de que funciona en general.
Simon Zyx
1
También necesita: javascript var fs = require('fs'); var path = require('path');
Tyler
2
Esto en realidad no copia archivos. Los lee y luego los escribe. Eso no es copiar. La copia incluye la fecha de creación, así como otras secuencias de metadatos que Windows y MacOS admiten y que este código no copia. A partir del nodo 8.5, debe llamar fs.copyo, fs.copySynccomo realmente llaman, las funciones de copia a nivel del sistema operativo en MacOS y Windows y, por lo tanto, copiar los archivos.
gman
1
lo siento, fs.copyFiley si exploras la fuente del nodo que verás en Mac y Windows, llaman a la función específica del sistema operativo para copiar un archivo
gman
52

Hay algunos módulos que admiten copiar carpetas con su contenido. El más popular sería la llave inglesa

// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');

Una alternativa sería node-fs-extra

fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) {
  if (err) {
    console.error(err);
  } else {
    console.log("success!");
  }
}); //copies directory, even if it has subdirectories or files
zemirco
fuente
3
la llave falla si el directorio para copiar contiene un enlace simbólico
DoubleMalt
2
también falla en Windows si el directorio ya existe, ncp funcionó de inmediato.
sangrado el
66
node-fs-extra funcionó para mí. Hereda el fs original y me gustó su forma de manejar el proceso. Menos código para actualizar en la aplicación.
dvdmn
15
Tenga en cuenta que wrenchha quedado en desuso y debe reemplazarse por node-fs-extra( github.com/jprichardson/node-fs-extra )
Ambidex
1
Wrench en realidad no copia archivos. Los lee, luego los escribe, luego copia su fecha. Eso no es copiar. La copia incluye otras secuencias de metadatos que Windows y MacOS admiten y que no se copian con una llave inglesa.
gman
38

Aquí hay una función que copia recursivamente un directorio y su contenido a otro directorio:

const fs = require("fs")
const path = require("path")

/**
 * Look ma, it's cp -R.
 * @param {string} src The path to the thing to copy.
 * @param {string} dest The path to the new copy.
 */
var copyRecursiveSync = function(src, dest) {
  var exists = fs.existsSync(src);
  var stats = exists && fs.statSync(src);
  var isDirectory = exists && stats.isDirectory();
  if (isDirectory) {
    fs.mkdirSync(dest);
    fs.readdirSync(src).forEach(function(childItemName) {
      copyRecursiveSync(path.join(src, childItemName),
                        path.join(dest, childItemName));
    });
  } else {
    fs.copyFileSync(src, dest);
  }
};
Lindsey Simon
fuente
3
Incluso si inserta una función de copia real, no debe seguir enlaces simbólicos (use en fs.lstatSynclugar de fs.statSync)
Simon Zyx
3
lo que pudo haber causado esta confusión es que fs.unlink elimina archivos, pero fs.link no copia sino que vincula.
Simon Zyx
3
@SimonSeyock: tiene razón ... linkingno está copiando ... El problema es que cuando modifica el contenido del archivo vinculado, el archivo original también cambiará.
Abdennour TOUMI
30

fs-extratrabajó para mí cuando ncpy se wrenchquedó corto:

https://www.npmjs.com/package/fs-extra

Será
fuente
3
Además, el desarrollador de wrenchdirige a los usuarios a usar, fs-extraya que ha dejado de utilizar su biblioteca.
mozillalives
22

Para el sistema operativo Linux / Unix, puede usar la sintaxis de shell

const shell = require('child_process').execSync ; 

const src= `/path/src`;
const dist= `/path/dist`;

shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);

¡Eso es!

Abdennour TOUMI
fuente
1
De nada 👋
Abdennour TOUMI
1
Esta es la solución más simple. ¡No es necesario reinventar las herramientas de UNIX!
Michael Franzl
11
nodejs ya se ejecuta en OSX / Linux / Windows esto sólo es la respuesta para 2 no todos 3.
mjwrazor
2
@AbdennourTOUMI, ¿qué pasa si está ejecutando en el servidor de Windows?
mjwrazor
3
Es por eso que comencé la respuesta con "Para el sistema operativo Linux / Unix, puede usar la sintaxis de shell .." 👍🏼
Abdennour TOUMI
19

El módulo fs-extra funciona de maravilla.

Instalar fs-extra

$ npm install fs-extra

El siguiente es el programa para copiar el directorio de origen al directorio de destino.

// include fs-extra package
var fs = require("fs-extra");

var source = 'folderA'
var destination = 'folderB'

// copy source folder to destination
fs.copy(source, destination, function (err) {
    if (err){
        console.log('An error occured while copying the folder.')
        return console.error(err)
    }
    console.log('Copy completed!')
});

Referencias

fs-extra: https://www.npmjs.com/package/fs-extra

Ejemplo: Tutorial de NodeJS - Node.js Copiar una carpeta

Mallikarjun M
fuente
¿Este proceso reemplaza el directorio o se fusiona con él?
SM Shahinul Islam
14

Así es como lo haría personalmente:

function copyFolderSync(from, to) {
    fs.mkdirSync(to);
    fs.readdirSync(from).forEach(element => {
        if (fs.lstatSync(path.join(from, element)).isFile()) {
            fs.copyFileSync(path.join(from, element), path.join(to, element));
        } else {
            copyFolderSync(path.join(from, element), path.join(to, element));
        }
    });
}

funciona para carpetas y archivos


fuente
3
Esta solución es breve y directa. Esto sería casi exactamente como lo haría, así que un +1 de mi parte. Debe mejorar su respuesta con comentarios en su código y describir por qué esta solución es preferida sobre otras y qué inconvenientes puede tener. - También actualice qué módulos requiere. ("ruta", "fs")
Andrew
compruebe si la carpeta existe en la parte superior ... salvará vidas ;-) if (! fs.existsSync (to)) fs.mkdirSync (to);
Tobias
9

Creé un pequeño ejemplo de trabajo que copia una carpeta de origen a otra carpeta de destino en solo unos pocos pasos (según la respuesta @ shift66 usando ncp):

paso 1 - Instala el módulo ncp:

npm install ncp --save

Paso 2: crea copy.js (modifica los valores srcPath y destPath a lo que necesites):

var path = require('path');
var ncp = require('ncp').ncp;

ncp.limit = 16;

var srcPath = path.dirname(require.main.filename); //current folder
var destPath = '/path/to/destination/folder'; //Any destination folder

console.log('Copying files...');
ncp(srcPath, destPath, function (err) {
  if (err) {
    return console.error(err);
  }
  console.log('Copying files complete.');
});

paso 3 - corre

node copy.js
Shahar
fuente
7

Esto es bastante fácil con el nodo 10.

const FSP = require('fs').promises;

async function copyDir(src,dest) {
    const entries = await FSP.readdir(src,{withFileTypes:true});
    await FSP.mkdir(dest);
    for(let entry of entries) {
        const srcPath = Path.join(src,entry.name);
        const destPath = Path.join(dest,entry.name);
        if(entry.isDirectory()) {
            await copyDir(srcPath,destPath);
        } else {
            await FSP.copyFile(srcPath,destPath);
        }
    }
}

Esto supone destque no existe.

mpen
fuente
3
Podemos hacer que esto funcione en el Nodo 8.x usando require('util').promisifycon fs.mkdiry en fs.copyFilelugar de require('fs').promises, que todavía es experimental en v11.1.
Sơn Trần-Nguyễn
@sntran ¿8.x tiene la withFileTypesopción? Porque eso le ahorra una statllamada
mpen
Desafortunadamente, 8.x no tiene withFileTypesopción.
Sơn Trần-Nguyễn
@ SơnTrần-Nguyễn 8.x llega al final de su vida útil el 31 de diciembre de 2019 - podría ser el momento de actualizar :-)
mpen
6

Ya sé muchas respuestas aquí, pero nadie respondió de manera simple. En cuanto a la documentación oficial de fs-exra , puedes hacerlo muy fácil

const fs = require('fs-extra')

// copy file
fs.copySync('/tmp/myfile', '/tmp/mynewfile')

// copy directory, even if it has subdirectories or files
fs.copySync('/tmp/mydir', '/tmp/mynewdir')
Freddy Daniel
fuente
asegúrese de establecer la opción recursiva. fs.copySync ('/ tmp / mydir', '/ tmp / mynewdir', {recursive: true})
Dheeraj Kumar
No puedo encontrar la opción { recursive: true }del documento de Github que mencionaste, No sé si funciona.
Freddy Daniel
Supongo que estamos hablando de fs-extra, pero su enlace github apunta a node-fs-extra. Podría ser una biblioteca diferente?
Dheeraj Kumar el
@DheerajKumar, muestra node-fs-extra en github pero fs-extra en npm . No sé que ambos son iguales, consulte el paquete de npm
Freddy Daniel
¿Fs-extra reemplaza fs?
Matt
4

Como solo estoy creando un script de nodo simple, no quería que los usuarios del script tuvieran que importar un montón de módulos externos y dependencias, así que me puse mi gorra de pensamiento e hice una búsqueda de comandos en ejecución desde el bash cáscara.

Este fragmento de código node.js copia recursivamente una carpeta llamada node-webkit.app en una carpeta llamada build:

   child = exec("cp -r node-webkit.app build", function(error, stdout, stderr) {
        sys.print("stdout: " + stdout);
        sys.print("stderr: " + stderr);
        if(error !== null) {
            console.log("exec error: " + error);
        } else {

        }
    });

Gracias a Lance Pollard en dzone por ayudarme a comenzar.

El fragmento anterior se limita a plataformas basadas en Unix como Mac OS y Linux, pero una técnica similar puede funcionar para Windows.

jmort253
fuente
4

@ mallikarjun-m gracias!

¡fs-extra hizo la cosa e incluso puede devolver Promise si no proporciona devolución de llamada! :)

const path = require('path')
const fs = require('fs-extra')

let source = path.resolve( __dirname, 'folderA')
let destination = path.resolve( __dirname, 'folderB')

fs.copy(source, destination)
  .then(() => console.log('Copy completed!'))
  .catch( err => {
    console.log('An error occured while copying the folder.')
    return console.error(err)
  })
Luckylooke
fuente
2

El que tiene soporte de enlace simbólico + no se lanza si existe un directorio.

function copyFolderSync(from, to) {
  try {
    fs.mkdirSync(to);
  } catch(e) {}

  fs.readdirSync(from).forEach((element) => {
    const stat = fs.lstatSync(path.join(from, element));
    if (stat.isFile()) {
      fs.copyFileSync(path.join(from, element), path.join(to, element));
    } else if (stat.isSymbolicLink()) {
      fs.symlinkSync(fs.readlinkSync(path.join(from, element)), path.join(to, element));
    } else if (stat.isDirectory()) {
      copyFolderSync(path.join(from, element), path.join(to, element));
    }
  });
}
allx
fuente
1

Este código funcionará bien, copiando recursivamente cualquier carpeta a cualquier ubicación. Solo Windows

var child=require("child_process");
function copySync(from,to){
    from=from.replace(/\//gim,"\\");
    to=to.replace(/\//gim,"\\");
    child.exec("xcopy /y /q \""+from+"\\*\" \""+to+"\\\"");
}

Funciona perfectamente para mi juego basado en texto para crear nuevos jugadores.

ModerateJavaScriptDev
fuente
1

Intenté fs-extra y copy-dir para copiar-carpeta-recursivamente. pero lo quiero

  1. funciona normalmente (copy-dir arroja un error irracional)
  2. proporciona dos argumentos en el filtro: ruta de archivo y tipo de archivo (fs-extra no dice tipo de archivo)
  3. tiene verificación dir-a-subdir y verificación dir-a-archivo

Entonces escribí el mío:

//node module for node 8.6+
var path=require("path");
var fs=require("fs");

function copyDirSync(src,dest,options){
  var srcPath=path.resolve(src);
  var destPath=path.resolve(dest);
  if(path.relative(srcPath,destPath).charAt(0)!=".")
    throw new Error("dest path must be out of src path");
  var settings=Object.assign(Object.create(copyDirSync.options),options);
  copyDirSync0(srcPath,destPath,settings);
  function copyDirSync0(srcPath,destPath,settings){
    var files=fs.readdirSync(srcPath);
    if (!fs.existsSync(destPath)) {
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      if(settings.overwrite)
        throw new Error(`Cannot overwrite non-directory '${destPath}' with directory '${srcPath}'.`);
      return;
    }
    files.forEach(function(filename){
      var childSrcPath=path.join(srcPath,filename);
      var childDestPath=path.join(destPath,filename);
      var type=fs.lstatSync(childSrcPath).isDirectory()?"directory":"file";
      if(!settings.filter(childSrcPath,type))
        return;
      if (type=="directory") {
        copyDirSync0(childSrcPath,childDestPath,settings);
      } else {
        fs.copyFileSync(childSrcPath, childDestPath, settings.overwrite?0:fs.constants.COPYFILE_EXCL);
        if(!settings.preserveFileDate)
          fs.futimesSync(childDestPath,Date.now(),Date.now());
      }
    });
  }
}
copyDirSync.options={
  overwrite: true,
  preserveFileDate: true,
  filter: function(filepath,type){return true;}
};

y una función similar mkdirs, que es una alternativa a mkdirp

function mkdirsSync(dest) {
  var destPath=path.resolve(dest);
  mkdirsSync0(destPath);
  function mkdirsSync0(destPath){
    var parentPath=path.dirname(destPath);
    if(parentPath==destPath)
      throw new Error(`cannot mkdir ${destPath}, invalid root`);
    if (!fs.existsSync(destPath)) {
      mkdirsSync0(parentPath);
      fs.mkdirSync(destPath);
    }else if(!fs.lstatSync(destPath).isDirectory()){
      throw new Error(`cannot mkdir ${destPath}, a file already exists there`);
    }
  }
}
fuweichin
fuente
0

Escribí esta función tanto para copiar (copyFileSync) como para mover (renameSync) archivos recursivamente entre directorios:

//copy files
copyDirectoryRecursiveSync(sourceDir, targetDir);
//move files
copyDirectoryRecursiveSync(sourceDir, targetDir, true);


function copyDirectoryRecursiveSync(source, target, move) {
if (!fs.lstatSync(source).isDirectory()) return;

var operation = move ? fs.renameSync : fs.copyFileSync;
fs.readdirSync(source).forEach(function (itemName) {
    var sourcePath = path.join(source, itemName);
    var targetPath = path.join(target, itemName);

    if (fs.lstatSync(sourcePath).isDirectory()) {
        fs.mkdirSync(targetPath);
        copyDirectoryRecursiveSync(sourcePath, targetDir);
    }
    else {
        operation(sourcePath, targetPath);
    }
});}
EladTal
fuente
0

Si está en Linux y el rendimiento no es un problema, puede usar la execfunción del child_processmódulo para ejecutar un comando bash:

const { exec } = require('child_process');
exec('cp -r source dest', (error, stdout, stderr) => {...});

En algunos casos, encontré esta solución más limpia que descargar un módulo completo o incluso usar el fsmódulo.

Emilio Grisolía
fuente
0

ncp bloquea el descriptor de archivo y activa la devolución de llamada cuando aún no se ha desbloqueado. Recomiendo usar el módulo de copia recursiva en su lugar. Admite eventos y puede estar seguro en el final de la copia.

Andrey Proskurin
fuente
0

Tenga cuidado al elegir su paquete. Algunos paquetes como copy-dir no admiten copiar archivos grandes de más de 0x1fffffe8 caracteres de largo. Lanzará algún error como:

buffer.js:630 Uncaught Error: Cannot create a string longer than 0x1fffffe8 characters 

He experimentado algo como esto en uno de mis proyectos. Finalmente, tuve que cambiar el paquete que estaba usando y ajustar mucho código. Yo diría que esta no es una experiencia muy agradable.

Si se desea una copia de origen múltiple y de destino múltiple, puede usar una copia mejor y escribir algo como esto:

// copy from multiple source into a directory
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], '/path/to/destination/folder');

o incluso :

// copy from multiple source into multiple destination
bCopy(['/path/to/your/folder1', '/path/to/some/file.txt'], ['/path/to/destination/folder', '/path/to/another/folder']);
Donovan P
fuente
-1

SÍ, aunque ncpes cool...

Es posible que desee / deba prometer su función para hacer es super cool. Ya que estás en ello, agrégalo a un toolsarchivo para reutilizarlo.

A continuación se muestra una versión de trabajo que es Asyncy utiliza Promises.


index.js

const {copyFolder} = require('./tools/');

return copyFolder(
    yourSourcePath,
    yourDestinationPath
)
.then(() => {
    console.log('-> Backup completed.')
}) .catch((err) => {
    console.log("-> [ERR] Could not copy the folder: ", err);
})

tools.js

const ncp = require("ncp");

/**
 * Promise Version of ncp.ncp()
 * 
 * This function promisifies ncp.ncp().
 * We take the asynchronous function ncp.ncp() with 
 * callback semantics and derive from it a new function with
 * promise semantics.
 */
ncp.ncpAsync = function (sourcePath, destinationPath) {
  return new Promise(function (resolve, reject) {
      try {
          ncp.ncp(sourcePath, destinationPath, function(err){
              if (err) reject(err); else resolve();
          });
      } catch (err) {
          reject(err);
      }
  });
};

/**
 * Utility function to copy folders asynchronously using
 * the Promise returned by ncp.ncp(). 
 */
const copyFolder = (sourcePath, destinationPath) => {
    return ncp.ncpAsync(sourcePath, destinationPath, function (err) {
        if (err) {
            return console.error(err);
        }
    });
}
module.exports.copyFolder = copyFolder;
Mick
fuente
-1

El enfoque más fácil para este problema es usar solo el módulo 'fs' y 'Path' y algo de lógica .....

Todos los archivos en la carpeta raíz se copian con el Nuevo nombre si lo desea, simplemente configure el número de versión, es decir ....................... "var v = 'Su directorio Nombre'"

en el prefijo del nombre de archivo V contenido agregado con el nombre del archivo.

var fs = require('fs-extra');
var path = require('path');

var c = 0;
var i =0 ;
var v = "1.0.2";
var copyCounter = 0;
var directoryCounter = 0; 
var directoryMakerCounter = 0;
var recursionCounter = -1;
var Flag = false;
var directoryPath = [] ;
var directoryName = [] ;
var directoryFileName = [];
var fileName;
var directoryNameStorer;
var dc = 0;
var route ;



if (!fs.existsSync(v)){
   fs.mkdirSync(v);
}

var basePath = path.join(__dirname, v);


function walk(dir){

  fs.readdir(dir, function(err, items) {

    items.forEach(function(file){

        file = path.resolve(dir, file);

        fs.stat(file, function(err, stat){
            if(stat && stat.isDirectory()){

                directoryNameStorer = path.basename(file);
                route = file;
                route = route.replace("gd",v);

                directoryFileName[directoryCounter] = route;
                directoryPath[directoryCounter] = file;
                directoryName[directoryCounter] = directoryNameStorer;

                directoryCounter++;
                dc++;

                if (!fs.existsSync(basePath+"/"+directoryName[directoryMakerCounter])){
                    fs.mkdirSync(directoryFileName[directoryMakerCounter]);
                    directoryMakerCounter++;
                }

            }else{

                    fileName = path.basename(file);
                    if(recursionCounter >= 0){
                        fs.copyFileSync(file, directoryFileName[recursionCounter]+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;
                    }else{
                        fs.copyFileSync(file, v+"/"+v+"_"+fileName, err => {
                            if(err) return console.error(err);
                        });
                        copyCounter++;    
                    }

                }
                if(copyCounter + dc == items.length && directoryCounter > 0 && recursionCounter < directoryMakerCounter-1){
                    console.log("COPY COUNTER :             "+copyCounter);
                    console.log("DC COUNTER :               "+dc);                        
                    recursionCounter++;
                    dc = 0;
                    copyCounter = 0;
                    console.log("ITEM DOT LENGTH :          "+items.length);
                    console.log("RECURSION COUNTER :        "+recursionCounter);
                    console.log("DIRECOTRY MAKER COUNTER :  "+directoryMakerCounter);
                    console.log(": START RECURSION :        "+directoryPath[recursionCounter]);
                    walk(directoryPath[recursionCounter]); //recursive call to copy sub-folder

                }

        })
    })
 });

}
 walk('./gd', function(err, data){ //Just Pass The Root Directory Which You Want to Copy
 if(err) throw err;
 console.log("done");
})
MM Furkan
fuente
-1

Así es como lo hice:

let fs = require('fs');
let path = require('path');

luego:

let filePath = //your FilePath

let fileList = []
        var walkSync = function(filePath, filelist) 
        {
          let files = fs.readdirSync(filePath);
          filelist = filelist || [];
          files.forEach(function(file) 
          {
            if (fs.statSync(path.join(filePath, file)).isDirectory()) 
            {
              filelist = walkSync(path.join(filePath, file), filelist);
            }
            else 
            {
              filelist.push(path.join(filePath, file));
            }
          });

          // Ignore hidden files
          filelist = filelist.filter(item => !(/(^|\/)\.[^\/\.]/g).test(item));

          return filelist;
        };

Entonces llame al método:

This.walkSync(filePath, fileList)
uyghurbeg
fuente