Cómo eliminar todos los archivos del directorio sin eliminar el directorio en Node.js

101

¿Cómo eliminar todos los archivos de un directorio sin eliminar un directorio en sí usando Node.js?
Quiero eliminar archivos temporales. Todavía no soy bueno con los sistemas de archivos.

Encontré este método, que eliminará archivos y el directorio. En eso, algo como /path/to/directory/*no funcionará.

Realmente no sé qué comandos debería usar. Gracias por la ayuda.

Tú mejor no
fuente
2
Si desea utilizar comodines, consulte npmjs.org/package/glob .
Felix Kling
1
solo busca la API, ¿qué tiene de difícil? tienes que conseguir los archivos en un directorio y luego borrarlos.
Sikorski
2
Glob hizo el trabajo, ¡gracias!
youbetternot

Respuestas:

161

Para eliminar todos los archivos de un directorio, primero debe enumerar todos los archivos del directorio usando fs.readdir, luego puede usar fs.unlinkpara eliminar cada archivo. También fs.readdirle dará solo los nombres de los archivos, necesita concatizar con el nombre del directorio para obtener la ruta completa.

Aquí hay un ejemplo

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

const directory = 'test';

fs.readdir(directory, (err, files) => {
  if (err) throw err;

  for (const file of files) {
    fs.unlink(path.join(directory, file), err => {
      if (err) throw err;
    });
  }
});

Actualizar la versión 14 del nodo

Hay una recursivebandera que puede utilizar rmdirpara eliminar todos los archivos de forma recursiva. Consulte la documentación de nodejs para obtener más información.

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

const directory = 'test';

fs.rmdir(directory, { recursive: true })
  .then(() => console.log('directory removed!'));
Rodrigo5244
fuente
4
esto funciona muy bien, y la mayoría ya tendrá fs y la ruta requerida, por lo que es una ventaja, no se necesitan paquetes adicionales. Acabo de cambiar 'prueba' por path.join (__ dirname, '../../public/uploads')
russiansummer
3
para agregar 2p., el fragmento es excelente y solo una cosa a tener en cuenta es que es asíncrono y, en casos de scripting / automatización, es posible que desee usar una versión síncrona del mismo, el fs.readdirSync. Simplemente asigne todos los archivos: const files = fs.readdirSync(directory);y repita de la misma manera for (const file of files) {.
fiesta el
¿Cómo excluir la carpeta ".git" en el directorio "prueba" ?
5ervant
Puede agregar una instrucción if en el bucle for para eliminar ese caso, pero si desea eliminar archivos y carpetas de forma recursiva, es posible que desee utilizar algún paquete npm. npmjs.com/package/fs-extra
Rodrigo5244
45

Sí, hay un módulo fs-extra . Hay un método .emptyDir()dentro de este módulo que hace el trabajo. Aquí hay un ejemplo:

const fsExtra = require('fs-extra')

fsExtra.emptyDirSync(fileDir)

También hay una versión asincrónica de este módulo. Cualquiera puede consultar el enlace.

Samiul Alam
fuente
3
Módulo muy útil, deberías probarlo, hay muchas funciones que seguro te encantarán.
gts
1
Sí, ¿por qué implementar algo que no sea trivial?
manuman94
1
Solo una pequeña advertencia, esta forma tiene un comportamiento ligeramente diferente al comportamiento deseado de la pregunta, porque la emptyDirfunción crea el directorio si no existe.
programmerRaj
35

Hay un paquete llamado rimraf que es muy útil. Es el comando de UNIX rm -rf para node.

Sin embargo, también puede ser demasiado poderoso porque puede eliminar carpetas muy fácilmente usándolo. Los siguientes comandos eliminarán los archivos dentro de la carpeta. Si elimina el *, eliminará la carpeta de registro.

const rimraf = require('rimraf');
rimraf('./log/*', function () { console.log('done'); });

https://www.npmjs.com/package/rimraf

Nicolás Guérinet
fuente
En mi opinión, lo que se puede resolver con una función, nunca debe resolverse con un paquete.
Aditya Anand
1
@AdityaAnand - ¿Qué función? es imposible sin importar algún paquete o escribir una tonelada de código usted mismo
vsync
12

Sobre la base de la respuesta de @ Waterscroll, si desea usar async y esperar en el nodo 8+:

const fs = require('fs');
const util = require('util');
const readdir = util.promisify(fs.readdir);
const unlink = util.promisify(fs.unlink);
const directory = 'test';

async function toRun() {
  try {
    const files = await readdir(directory);
    const unlinkPromises = files.map(filename => unlink(`${directory}/${filename}`));
    return Promise.all(unlinkPromises);
  } catch(err) {
    console.log(err);
  }
}

toRun();
Jason Kim
fuente
1
¡estupendo! Justo lo que estaba buscando, ya que quiero mantener un archivo específico en la carpeta: D
Silve2611
1
Solo una nota que return await Promisees redundante. Puedes simplemente hacer return Promise. La toRunfunción es asincrónica, por lo que cuando se devuelve una promesa, la aplicación puede esperarla.
ItalyPaleAle
Ahora puede usar const { promises: fs } = require('fs');desde el nodo 10+, creo.
Shikyo
0

🚀 gráfico-fs


Instalar en pc

npm i graph-fs

Utilizar

const {Node} = require("graph-fs");
const directory = new Node("/path/to/directory");

directory.clear(); // <--
Yairopro
fuente