Tengo un montón de archivos de texto (aquí los llamo 'archivos de índice') en un directorio, cada uno de los cuales contiene una lista de archivos separados por saltos de línea.
En mi secuencia de comandos NodeJS, quiero iterar sobre estos archivos de índice y hacer una llamada a tar usando el archivo de índice como entrada a través del argumento -T . Para esto estoy usando spawnSync
Lo que debería suceder es que tar luego archiva todos los archivos enumerados en el archivo de índice.
En cambio, lo que está sucediendo es que obtengo un archivo completamente vacío y sin resultados.
Aquí está la parte relevante de mi script:
console.log("Processing index files"); process.chdir(sourcePath); for(const key in indexFiles) { let index = indexFiles[key]; console.log("Processing: "+index); let commandLine = "tar acf "+outputPath+'/'+key+".tar.bz2 -T "+index; console.log(process.cwd()); console.log(commandLine); let tar = spawnSync("tar", ["acf", outputPath+"/"+key+".tar.bz2", "-T", index], {cwd:sourcePath, stdio:"inherit"}); } En este script sourcePath es la ubicación de los archivos enumerados en el archivo de índice. Lo estoy configurando como CWD ya que esa es la forma en que tar funcionaría cuando lo llamo desde la línea de comando.
Lo extraño es que, como puede ver, estoy cerrando la sesión tanto en sourcePath como en la línea de comando equivalente para mi llamada de spawnSync . Así que la salida se ve así.
Processing index files /media/chmo/NewLinux/scan/2022-03-22/temp Processing: /media/chmo/NewLinux/wrangled/d01d36c8-698a-4791-9075-73fa4c0af881_0.txt /media/chmo/NewLinux/scan/2022-03-22/temp tar acf /media/chmo/NewLinux/wrangled/0.tar.bz2 -T /media/chmo/NewLinux/wrangled/d01d36c8-698a-4791-9075-73fa4c0af881_0.txt Literalmente puedo tomar la penúltima línea, que debería ser el CWD para mi llamada a spawnSync , cd en ese directorio y luego ejecutar el comando como aparece en la última línea, y eso funciona perfectamente. Sin embargo, cuando hago lo que debería ser exactamente la misma operación pero llamada desde NodeJS, simplemente crea un archivo tar vacío.
¿Que pasa con eso? No estoy seguro de cómo más explicarlo. Parece algo muy básico que simplemente no funciona, así que espero haber hecho algo mal y alguien pueda señalar qué es.
no necesita cambiar cwd así, solo páselo al tercer argumento de spawnSync .
spawnSync('tar', [args], { cwd: sourcePath }) Recomiendo usar execSync sobre spawnSync en su situación, ya que no necesita más información que la salida del comando tar (que está vacío en caso de éxito).
Hice un pequeño guión que se acerca a sus requisitos, espero que esto lo ayude.
const fs = require('fs/promises') const { execSync } = require('child_process') const path = require('path') const [, , indexfilePath] = process.argv async function main() { const indexFilesDir = path.resolve(indexfilePath) const files = await fs.readdir(indexFilesDir, { withFileTypes: true }) for (const f of files) { if (!f.isFile()) continue console.log('processing index file', f.name) const output = execSync(`tar -acf /tmp/node-${f.name}.tar.bz2 -T ${f.name}`, { cwd: indexFilesDir, // encoding: 'utf8', }) console.log(`------> ${f.name} <------`) process.stdout.write(output) console.log(`------> end <------`) } } main() .then(() => { console.log('completed main') }) .catch(console.error) el script anterior etiqueta el directorio de archivos de índice y guarda el archivo tar en el directorio /tmp .
$ tree ./ . ├── cli.js └── test ├── contents │ ├── en.txt │ └── fr.txt └── index-1.txt contenido del archivo del archivo de index-1.txt .
$ cat test/index-1.txt ./contents/en.txt ./contents/fr.txtuso
$ node cli.js ./test/ processing index file index-1.txt ------> index-1.txt <------ ------> end <------ completed main $ ls /tmp/ node-index-1.txt.tar.bz2 $ tar --list -f /tmp/node-index-1.txt.tar.bz2 ./contents/en.txt ./contents/fr.txt nota: si está usando esto dentro de un servidor web u otro, use exec o spawn con Promise wrap. Debido a que las operaciones de sincronización bloquean el bucle de eventos de nodejs.