it-swarm-eu.dev

Jaký je nejlepší způsob, jak se po rozdělení znovu připojit k souborům?

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.

79
cwd

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.

54
rozcietrzewiacz

Pod kapotou

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.

Na rozdělení a spojení

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 catpřímo s otevřeným souborem, což znamená, že „procházení stdoutem“ je stejné jako zápis na disk.

8

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ů:

  • jeden „nasávat“ soubor jeho přečtením, odesláním do stdout a pokud je hotový, jeho odebráním
  • a jeden pro ukládání dat „za běhu“.

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.

3
glglgl

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.

1
Nole

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.

0
golimar