#windows #nodejs #файлы #bash #bat
В файле join.txt по одному на строке заданы имена файлов, которые надо объединить в порядке следования. Хочу это сделать в консоли. Попытался сделать так (в командной строке, не в батнике): for /f "tokens=*" %f in (join.txt) do type "%f" >>result.bin но в одном из случаев где-то потерялся байт - суммарный размер не сходится на 1 байт и при сравнении с правильным файлом видно, что пропущен байт с кодом 1A: Как объединить файлы так, чтобы бинарные данные не пострадали?
Ответы
Ответ 1
Если используется Windows 10, в котором установлена линуксовая подсистема, то вместо командной строки можно использовать bash: while read f || [[ -n $f ]]; do cat "$f" >>result.bin doneОтвет 2
В общем, с командной строкой ничего не придумал и написал скрипт для node.js: var fs = require('fs'); var filename = "join.txt"; // process.argv[2]; var dest = "result.bin"; // filename.replace(/\[names\](\.\w+)\.txt$/, "[full]$1"); if (filename === dest) { console.error("Can't determine dest filename"); return; } var files = fs.readFileSync(filename, "utf8").split(/\r?\n/); var resStream = fs.createWriteStream(dest, { flags: "wx" }); function go(i) { if (i === files.length) return resStream.end(); var cur = fs.createReadStream(files[i]) cur.pipe(resStream, {end:false}); cur.on('end', () => go(i+1)); } go(0);Ответ 3
Решается средствами batch. Нужно просто копировать всё в результирующий файл. Создаем пустой файл, затирая старый. Затем все, найденное что в файл-списке, помещаем в результат. @copy /y nul result.bin @for /f "tokens=*" %%f in (join.txt) do copy /b result.bin +"%%f" result.bin
Комментариев нет:
Отправить комментарий