Pokud mám velký soubor a potřebuji jej rozdělit na 100 megabajtových kousků, udělám to
split -b 100m myImage.iso
To mi obvykle dává něco podobného
xaa
xab
xac
xad
A abych je dal dohromady, používám je
cat x* > myImage.iso
Vypadá to, že by měl existovat efektivnější způsob než čtení každého řádku kódu ve skupině souborů s cat
a přesměrování výstupu na nový soubor. Jako způsob, jak otevřít pouze dva soubory, odstranit značku EOF
z prvního a připojit je - aniž byste museli procházet veškerý obsah.
Windows/DOS má příkaz pro kopírování binárních souborů. Nápověda uvádí, že tento příkaz byl navržen tak, aby dokázal kombinovat více souborů. Funguje s touto syntaxí: (/b
je pro binární režim)
copy /b file1 + file2 + file3 outputfile
Existuje něco podobného nebo lepšího způsobu, jak se připojit k velkým souborům na Linuxu než kočka?
Aktualizace
Zdá se, že cat
je ve skutečnosti správný způsob a nejlepší způsob, jak spojit soubory. Jsem rád, že jsem po celou dobu používal správný příkaz :) Děkujeme všem za vaši zpětnou vazbu.
To je přesně to, k čemu cat
bylo vyrobeno. Protože se jedná o jeden z nejstarších GNU nástrojů), myslím, že je velmi nepravděpodobné, že jakýkoli jiný nástroj to dělá rychleji/lépe. A nejde o potrubí - jedná se pouze o přesměrování výstupu.
Neexistuje efektivnější způsob, jak zkopírovat první soubor, poté zkopírovat druhý soubor za ním atd. Dělá to DOS copy
i cat
.
Každý soubor je uložen nezávisle na ostatních souborech na disku. Téměř každý souborový systém navržený pro ukládání dat na diskovém zařízení pracuje pomocí bloků. Zde je velmi zjednodušená prezentace toho, co se stane: disk je rozdělen na bloky, řekněme 1 kB, a pro každý soubor operační systém ukládá seznam bloků, které jej tvoří. Většina souborů není celé číslo dlouhé, takže poslední blok je obsazen pouze částečně. V praxi mají souborové systémy mnoho optimalizací, jako je sdílení posledního částečného bloku mezi několika soubory nebo ukládání „bloků 46798 až 47913“, spíše než „blok 46798, blok 46799,…“. Když operační systém potřebuje vytvořit nový soubor, hledá volné bloky. Bloky nemusí být po sobě jdoucí: Pokud jsou pouze bloky 4, 5, 98 a 178 volné, můžete stále ukládat soubor 4 kB. Použití bloků namísto přechodu na úroveň bajtů pomáhá zrychlit nalezení volných bloků pro nový nebo rostoucí soubor a snižuje problémy způsobené fragmentací, když vytváříte nebo rostete a odstraňujete nebo zmenšujete mnoho souborů (ponechává stále větší počet díry).
Dalo by se podpořit částečné bloky v polovině souboru, ale to by přidalo značnou komplikovanost, zejména když přistupujete k souborům nesekvenčně: pro přechod na 10340. bajt byste již nemohli přeskočit na 100. bajt 11. bloku, měli byste zkontrolovat délku každého zásahového bloku.
Vzhledem k použití bloků se nemůžete spojit pouze se dvěma soubory, protože první soubor obecně končí uprostřed bloku. Jistě, můžete mít zvláštní případ, ale pouze pokud chcete smazat oba soubory při zřetězení. To by bylo velmi specifické zacházení pro vzácnou operaci. Takové speciální zacházení nežije samo o sobě, protože v typickém souborovém systému je přístup k mnoha souborům současně. Takže pokud chcete přidat optimalizaci, musíte pečlivě promyslet: co se stane, když nějaký jiný proces čte jeden ze zúčastněných souborů? Co se stane, když se někdo pokusí zřetězit A a B, zatímco někdo zřetězí A a C? A tak dále. Celkově by tato vzácná optimalizace byla velkou zátěží.
Celkově tedy nemůžete zefektivnit spojení souborů bez větších obětí jinde. Nestojí to za to.
split
a cat
jsou jednoduché způsoby rozdělení a spojení souborů. split
se stará o vytváření souborů pojmenovaných v abecedním pořadí, takže cat *
pracuje pro připojení.
Nevýhodou cat
pro připojení je, že není odolný proti běžným režimům selhání. Pokud je jeden ze souborů zkrácen nebo chybí, cat
si nebude stěžovat, dostanete pouze poškozený výstup.
Existují kompresní nástroje, které vytvářejí multipartové archivy, například zipsplit
a rar -v
. Nejsou příliš unixy, protože komprimují a balí (sestaví více souborů do jednoho) kromě rozdělení (a naopak rozbalí a rozbalí kromě připojení). Jsou však užitečné v tom, že ověřují, že máte všechny součásti a že jsou kompletní.
Vypadá to, že by měl existovat efektivnější způsob, než převést veškerý obsah prostřednictvím systému
stdin
/stdout
Až na to, že se to opravdu neděje. Shell spojuje stdout cat
přímo s otevřeným souborem, což znamená, že „procházení stdoutem“ je stejné jako zápis na disk.
Jednou jsem měl přesně tento problém: Chtěl jsem se připojit k některým souborům, ale neměl jsem dostatek místa na disku, abych je držel dvakrát.
Takže jsem napsal spoustu programů:
To mi umožnilo udělat něco podobného
partto sourcefile | mybuffer 128M >>cumufile
a tedy odebrání zdrojového souboru, zatímco 128M bylo stále nepsané. Trochu nebezpečné, ale pokud data nejsou tak drahá, nebo existují i někde jinde, je to možné.
V případě potřeby mohu poskytnout zdroj.
Rozdělení souborů
Rozdělené podle velikosti
Pokud chcete rozdělit velký soubor na malé soubory a zvolit název a velikost malých výstupních souborů, je to tak.
split -b 500M videos\BigVideoFile.avi SmallFile.
Tímto způsobem se rozhodnete rozdělit jeden velký soubor na menší části o velikosti 500 MB. Také chcete, aby názvy souborů součástí byly SmallFile. Všimněte si, že potřebujete tečk za názvem souboru. Výsledkem by mělo být generování nových souborů, jako je tento:
SmallFile.ab SmallFile.ad SmallFile.af SmallFile.ah SmallFile.aj
SmallFile.aa SmallFile.ac SmallFile.ae SmallFile.ag SmallFile.ai SmallFile.ak
...
Rozdělené podle počtu čar
Tímto způsobem rozdělíte textový soubor na menší soubory omezené na 50 řádků.
split -l 50 text_to_split.txt
Výsledkem by mělo být něco takového:
xaa xab xac ...
Rozdělit podle bajtů
Rozdělit na malé soubory s vlastní velikostí malých souborů v bajtech:
split -b 2048 BigFile.mp4
Výsledek by měl být podobný výsledku z rozdělení podle počtu řádků .
Spojování souborů
Soubory můžete spojovat dvěma způsoby. První z nich je:
cat SmallFile.* > OutputBigVideoFile.avi
nebo s:
cat SmallFile.?? > OutputBigVideoFile.avi
Poznámka: Když se připojujete k souborům, malé soubory by se neměly poškodit. Také všechny malé (částečné) soubory by měly být ve stejném adresáři.
Technicky vzato, jedná se o způsob přístupu k celému souboru bez nutnosti číst a zapisovat celý obsah a mohl by být užitečný pro velké soubory nebo pokud zbývá málo místa:
$ mkfifo myImage.iso
$ cat xa{a..g} > myImage.iso &
A pak použijte myImage.iso
, například
$ md5sum myImage.iso
Samozřejmě myImage.iso
je speciální soubor (pojmenovaný kanál) a nejedná se o běžný soubor, takže to může být užitečné nebo nemusí v závislosti na tom, co se snažíte udělat.