Se eu tiver um arquivo grande e precisar dividi-lo em pedaços de 100 megabytes, farei
split -b 100m myImage.iso
Isso geralmente me dá algo como
xaa
xab
xac
xad
E para reuni-los, tenho usado
cat x* > myImage.iso
Parece que deve haver uma maneira mais eficiente do que ler cada linha de código em um grupo de arquivos cat
e redirecionar a saída para um novo arquivo. Como uma maneira de apenas abrir dois arquivos, remover o EOF
marcador do primeiro e conectá-los - sem ter que percorrer todo o conteúdo.
O Windows / DOS possui um comando de cópia para arquivos binários. A ajuda menciona que este comando foi projetado para poder combinar vários arquivos. Funciona com esta sintaxe: ( /b
é para o modo binário)
copy /b file1 + file2 + file3 outputfile
Existe algo semelhante ou uma maneira melhor de juntar arquivos grandes no Linux do que o gato?
Atualizar
Parece que cat
é de fato o caminho certo e a melhor maneira de ingressar em arquivos. Fico feliz em saber que eu estava usando o comando certo o tempo todo :) Obrigado a todos por seus comentários.
cat x*
, porque a ordem dos arquivos depende das suas configurações de localidade. É melhor começar a digitarcat x
, do que pressionar Esc e depois*
- você verá a ordem expandida dos arquivos e poderá reorganizá-los.cat x*
você poderia considerar a expansão cinta shell,cat xa{a..g}
o que amplia a seqüência especificada paracat
Xaa xab XAC xad Xae XAF XAGcat x*
? Será que a nova definição de local não afectam tambémsplit
para que, sesplit
ecat x*
foram usados no mesmo sistema que sempre funciona?split.c
em GNU Coreutils, os sufixos são construídos a partir de uma matriz fixa de caracteres:static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";
. O sufixo não seria afetado pelo código do idioma. (Mas eu não acho que qualquer local sã iria reorganizar as letras minúsculas, mesmo EBCDIC mantém sua ordem standard.)Respostas:
Isso é exatamente o que
cat
foi feito. Como é uma das ferramentas GNU mais antigas, acho muito improvável que qualquer outra ferramenta faça isso mais rápido / melhor. E não é um canal - apenas redireciona a saída.fonte
cat x, then press Esc
truque que você mencionou é puro .. Eu estive procurando por algo assim, graças ... bom comentário e boa respostaCtrl+W
recortar uma palavra eCtrl+Y
colá-la.Sob o capô
Não há maneira mais eficiente do que copiar o primeiro arquivo, depois copiar o segundo arquivo e assim por diante. Tanto o DOS
copy
quanto ocat
fazem.Cada arquivo é armazenado independentemente de outros arquivos no disco. Quase todo sistema de arquivos projetado para armazenar dados em um dispositivo semelhante a um disco opera por blocos. Aqui está uma apresentação altamente simplificada do que acontece: o disco é dividido em blocos de, digamos 1kB, e para cada arquivo o sistema operacional armazena a lista de blocos que o compõem. Como a maioria dos arquivos não possui um número inteiro de blocos, o último bloco é apenas parcialmente ocupado. Na prática, os sistemas de arquivos têm muitas otimizações, como compartilhar o último bloco parcial entre vários arquivos ou armazenar os "blocos 46798 a 47913" em vez de "bloco 46798, bloco 46799, ...". Quando o sistema operacional precisa criar um novo arquivo, ele procura blocos gratuitos. Os blocos não precisam ser consecutivos: se apenas os blocos 4, 5, 98 e 178 forem gratuitos, você ainda poderá armazenar um arquivo de 4kB.
Você poderia suportar blocos parciais no meio do arquivo, mas isso acrescentaria uma complexidade considerável, principalmente ao acessar arquivos de forma não sequencial: para pular para o 10340º byte, não era possível pular para o 100º byte do 11º bloco, você teria para verificar o comprimento de cada bloco intermediário.
Dado o uso de blocos, você não pode unir apenas dois arquivos, porque, em geral, o primeiro arquivo termina no meio do bloco. Claro, você pode ter um caso especial, mas apenas se desejar excluir os dois arquivos ao concatenar. Isso seria um tratamento altamente específico para uma operação rara. Esse tratamento especial não funciona por si só, porque em um sistema de arquivos típico, muitos arquivos estão sendo acessados ao mesmo tempo. Portanto, se você deseja adicionar uma otimização, precisa pensar com cuidado: o que acontece se algum outro processo estiver lendo um dos arquivos envolvidos? O que acontece se alguém tenta concatenar A e B enquanto alguém concatena A e C? E assim por diante. Em suma, essa rara otimização seria um fardo enorme.
Em suma, você não pode tornar os arquivos de junção mais eficientes sem fazer grandes sacrifícios em outros lugares. Não vale a pena.
Sobre a divisão e união
split
ecat
são maneiras simples de dividir e juntar arquivos.split
cuida da produção de arquivos nomeados em ordem alfabética, para quecat *
funcione para ingressar.Uma desvantagem da
cat
junção é que ela não é robusta contra os modos de falha comuns. Se um dos arquivos estiver truncado ou ausente,cat
não reclamará, você terá apenas uma saída danificada.Existem utilitários de compactação que produzem arquivos com várias partes, como
zipsplit
erar -v
. Eles não são muito unixy, porque compactam e empacotam (montam vários arquivos em um) além de dividir (além disso, descompactam e descompactam além de se unirem). Mas eles são úteis, pois verificam se você possui todas as partes e se estão completas.fonte
Só que não é exatamente isso que está acontecendo. O shell está conectando o stdout
cat
diretamente ao arquivo aberto, o que significa que "passar pelo stdout" é o mesmo que gravar no disco.fonte
cat
. Obrigado por me informar sobre a conexão direta.Uma vez tive exatamente esse problema: queria ingressar em alguns arquivos, mas não tinha espaço em disco suficiente para mantê-los duplamente.
Então, eu escrevi vários programas:
Isso me permitiu fazer algo como
e, portanto, removendo o arquivo de origem enquanto 128M ainda não estava gravado. Um pouco perigoso, mas se os dados não forem tão preciosos ou também existirem em outro lugar, é possível.
Se necessário, eu posso fornecer a fonte.
fonte
Tecnicamente falando, essa é uma maneira de acessar o arquivo inteiro sem precisar ler e gravar todo o conteúdo e pode ser útil para arquivos grandes ou se houver pouco espaço:
E então use
myImage.iso
, por exemploEmbora, obviamente,
myImage.iso
seja um arquivo especial (pipe nomeado) e não um arquivo regular, isso pode ser útil ou não, dependendo do que você está tentando fazer.fonte
Divisão de arquivos
Dividir por tamanho
Se você deseja dividir arquivos grandes em arquivos pequenos e escolher o nome e o tamanho dos arquivos de saída pequenos, é esse o caminho.
Dessa maneira, você escolhe dividir um arquivo grande em partes menores de 500 MB. Você também deseja que os nomes dos arquivos de peça sejam SmallFile. Observe que você precisa de um ponto após o nome do arquivo. O resultado deve ser a geração de novos arquivos como este:
Dividir pelo número de linhas
Dessa forma, você dividirá o arquivo de texto em arquivos menores, limitados a 50 linhas.
O resultado deve ser algo como isto:
Dividir por bytes
Divida em arquivos pequenos com tamanho personalizado de arquivos pequenos em bytes:
O resultado deve ser semelhante ao resultado da Divisão por número de linhas .
Arquivos ingressando
Você pode juntar arquivos de duas maneiras. O primeiro é:
ou com:
Nota: Ao ingressar nos arquivos, os arquivos pequenos não devem ser danificados. Todos os arquivos pequenos (parte) também devem estar no mesmo diretório.
fonte