Přesně to je cat
byl vyroben pro. Protože je to jeden z nejstarších nástrojů GNU, myslím, že je velmi nepravděpodobné, že by to nějaký jiný nástroj dokázal rychleji/lépe. A není to potrubí - je to pouze přesměrování výstupu.
Pod pokličkou
Neexistuje efektivnější způsob, než zkopírovat první soubor, poté zkopírovat druhý soubor za ním a tak dále. Oba DOS copy
a cat
udělejte to.
Každý soubor je uložen nezávisle na ostatních souborech na disku. Téměř každý souborový systém určený k ukládání dat na diskové zařízení funguje po blocích. Zde je velmi zjednodušená prezentace toho, co se děje:disk je rozdělen na bloky o velikosti řekněme 1 kB a pro každý soubor operační systém ukládá seznam bloků, které jej tvoří. Většina souborů nemá celý počet bloků, takže poslední blok je obsazený jen částečně. V praxi mají souborové systémy mnoho optimalizací, jako je sdílení posledního dílčího bloku mezi několika soubory nebo ukládání „bloků 46798 až 47913“ namísto „bloku 46798, bloku 46799, …“. Když operační systém potřebuje vytvořit nový soubor, hledá volné bloky. Bloky nemusí být po sobě jdoucí:pokud jsou volné pouze bloky 4, 5, 98 a 178, stále můžete uložit soubor o velikosti 4 kB. Použití bloků místo toho, aby se snižovalo na úroveň bajtů, výrazně urychluje hledání volných bloků pro nový nebo rostoucí soubor a snižuje problémy způsobené fragmentací, když vytváříte nebo zvětšujete a odstraňujete nebo zmenšujete velké množství souborů (zanechává narůstající počet souborů díry).
Mohli byste podporovat částečné bloky uprostřed souboru, ale to by přidalo značnou složitost, zejména při přístupu k souborům nesekvenčně:pro skok na 10340. bajt byste již nemohli skočit na 100. bajt 11. bloku, museli byste zkontrolovat délku každého mezilehlého bloku.
Vzhledem k použití bloků nemůžete pouze spojit dva soubory, protože obecně první soubor končí uprostřed bloku. Jistě, můžete mít speciální případ, ale pouze pokud chcete při zřetězení smazat oba soubory. To by bylo vysoce specifické zacházení pro vzácnou operaci. Takové speciální zacházení nefunguje samo o sobě, protože na typickém souborovém systému se přistupuje k mnoha souborům současně. Pokud tedy chcete přidat optimalizaci, musíte se pečlivě zamyslet:co se stane, když některý ze zapojených souborů čte jiný proces? 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ě vzato by tato vzácná optimalizace představovala obrovskou zátěž.
Suma sumárum, spojování souborů nemůžete zefektivnit bez velkých obětí jinde. Nestojí to za to.
O dělení a spojování
split
a cat
jsou jednoduché způsoby rozdělování a spojování souborů. split
stará se o vytváření souborů pojmenovaných v abecedním pořadí, takže cat *
funguje pro připojení.
Nevýhoda cat
pro spojení je, že není odolný vůči běžným poruchovým režimům. Pokud je jeden ze souborů zkrácený nebo chybí, cat
nebude si stěžovat, jen dostanete poškozený výstup.
Existují komprimační nástroje, které vytvářejí vícedílné archivy, jako je zipsplit
a rar -v
. Nejsou příliš unixové, protože kromě rozdělování komprimují a balí (skládají více souborů do jednoho) (a naopak kromě spojování rozbalují a dekomprimují). Ale jsou užitečné v tom, že ověřují, že máte všechny díly a že díly jsou kompletní.
Zdá se, že by měl existovat efektivnější způsob, než předávat veškerý obsah prostřednictvím systémového
stdin
/stdout
Až na to, že se to ve skutečnosti neděje. Shell připojuje stdout z cat
přímo do otevřeného souboru, což znamená, že "procházení stdout" je stejné jako zápis na disk.