
Eu gostaria de mesclar arquivos binários de forma eficiente usando um comando shell e rapidamente encontrei formas clássicas como esta:
cat file1 file2 > file3
Não é ruim, mas:
- É lento. O acesso IO é lento.
- Precisa de espaço extra. Não quero copiar os arquivos. Basta concatená-los.
Os sistemas de arquivos são ótimos para lidar com a fragmentação de arquivos. Não podemos simplesmente mesclar arquivos usando esse mecanismo?
Responder1
Você consegue fazer isso:
cat file2 file3 [...] filen >> file1
Isso concatenará file2
, file3
,..., filen
ao final do file1
local. O >>
operador diz ao shell para escrever nofinal do arquivo.
Você deseja aproveitar o sistema de arquivos para "lidar com a fragmentação de arquivos". Infelizmente, não existe uma maneira geral de fazer isso. É porque os "sistemas de arquivos" são muito mais gerais que os sistemas de arquivos em discos - por exemplo, você temNFS,FUSÍVEL, e muitos outros mecanismos que permitem expor qualquer tipo de recurso (não apenasbloquear dispositivoscomo discos rígidos) como uma hierarquia de sistema de arquivos. Mesmo para sistemas de arquivos baseados em dispositivos de blocos, não existe um mecanismo padrão para fazer isso e também não conheço nenhum mecanismo específico de implementação.
Responder2
Coloque seus nomes de arquivos em ordem em um arquivo de texto list.txt
separado por novas linhas. Então execute isso no bash:
while read line; do echo -n . ; dd if="$line" of=out status=none conv=notrunc oflag=append; done < list.txt
Isto criará o arquivo concatenado 'out' no diretório atual.
Responder3
dd if=firstfile.raw > completedfile.raw
dd if=nfile.raw >> completedfile.raw
dd if=lastfile.raw >> completedfile.raw