GNU/Linux >> Znalost Linux >  >> Linux

Jaký je nejlepší způsob, jak znovu spojit soubory po jejich rozdělení?

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.


Linux
  1. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?

  2. Jaké je nejlepší VPS:Windows nebo Linux?

  3. Jaký je nejlepší způsob, jak vyslat signál všem členům procesní skupiny?

  1. Jaký je nejlepší způsob, jak zvládnout stav nedostatku paměti v Javě?

  2. Jaký je nejlepší způsob, jak vytvořit flash disk s mnoha zaváděcími věcmi

  3. Jaký je nejúčinnější způsob, jak přesunout velké množství souborů, které jsou umístěny v jednom adresáři?

  1. Hierarchie souborů Linux – jaké je nejlepší umístění pro ukládání souborů zámků?

  2. Jaký je nejrychlejší způsob odstranění všech souborů a podsložek v adresáři?

  3. Jaký je nejlepší způsob, jak zkontrolovat, zda je svazek připojen ve skriptu Bash?