Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

243
Visualizações
Generación de tar desde nodejs con archivo de entrada

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.

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

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.txt

uso

 $ 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.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda