Preciso concatenar pedaços de dois arquivos:
se eu precisasse concatenar arquivos inteiros, eu poderia simplesmente fazer
cat file1 file2 > output
Mas preciso pular primeiro 1 MB do primeiro arquivo e quero apenas 10 MB do segundo arquivo. Parece um trabalho para dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
Existe a possibilidade de fazer isso em uma etapa? ou seja, sem a necessidade de salvar os resultados intermediários? Posso usar vários arquivos de entrada dd
?
oflag=append conv=notrunc
), portanto, os sistemas de arquivos que fazem alocação atrasada (como o XFS) são menos propensos a decidir que o arquivo está sendo gravado quando ainda há mais.dd
não seja solicitadosync
, a alocação atrasada não deve ocorrer imediatamente (a menos que a memória esteja fraca, nesse caso, nenhum dos métodos adiará a alocação).bash
emksh
que não otimizam a bifurcação para o último comando em um subshell, você pode torná-lo um pouco mais eficiente substituindo o subshell por um grupo de comandos. Para outros shells, isso não deve importar, e a abordagem do subshell pode até ser um pouco mais eficiente, pois o shell não precisa salvar e restaurar o stdout.Eu não acho que você possa ler facilmente vários arquivos em uma única
dd
invocação, mas você pode acrescentar para criar o arquivo de saída em várias etapas:Você precisa especificar ambos
conv=notrunc
eoflag=append
. O primeiro evita truncar a saída, o segundo começa a gravar a partir do final do arquivo existente.fonte
Tenha em mente que
dd
é uma interface de cru para aread()
,write()
elseek()
chamada de sistema. Você pode usá-lo apenas com confiabilidade para extrair blocos de dados de arquivos regulares, dispositivos de bloco e alguns dispositivos de caracteres (como/dev/urandom
), ou seja, arquivos para os quaisread(buf, size)
é garantido que retornesize
enquanto o final do arquivo não for atingido.Para tubos, soquetes e a maioria dos dispositivos de caracteres (como ttys), você não tem essa garantia, a menos que faça
read()
s do tamanho 1 ou use add
extensão GNUiflag=fullblock
.Então:
Ou:
Ou com conchas com suporte embutido para um operador de busca como
ksh93
:Ou
zsh
(supondo que vocêhead
suporte a-c
opção aqui):fonte
$IFS
. Independentemente do conteúdo da variável / expansão. Veja também as implicações de segurança de esquecer de citar uma variável na festança conchas / POSIXgdd
vez dedd
. Isso é um erro de digitação ou é intencional?Com um bash ism e um funcionalmente "uso inútil de gato ", mas mais próximo da sintaxe que o OP usa:
(Dito isto, a resposta de Stephen Kitt parece ser o método mais eficiente possível.)
fonte
<(...)
é um kshismo que é copiadozsh
ebash
copiado.