Portál AbcLinuxu, 30. dubna 2025 19:10
V dnešním díle si popíšeme nástroj split
pro rozdělování souborů na části a dd
pro nízkoúrovňové kopírování souborů.
split
je program sloužící k rozdělení většího souboru na několik menších. Název split znamená anglicky „rozdělit“. Program se poprvé objevil v systému AT&T UNIX v3.
Základní použití vypadá následovně:
split velky_textovy_soubor.txt
Tento příkaz rozdělí daný soubor po 1000 řádcích do několika menších. Počet řádků lze ovlivnit přepínačem -l, kterému se předá požadovaný počet řádků. Základ názvu výstupních souborů, jelikož jsme žádný nezadali jako druhý argument, se použije výchozí, a tp je „x“. Použije se i výchozí délka přípony, což obnáší dva znaky („aa“, „ab“, atd.) a lze ovlivnit přepínačem -a následovaným celočíselnou hodnotou. Výstupní soubory se tedy budou jmenovat „xaa“, „xab“, „xac“ a tak dále.
split -a 3 -l 2000 velky_textovy_soubor.txt casti_velkeho_textoveho_souboru.
Tento příkaz rozdělí daný soubor po 2000 řádcích a výstupní soubory budou mít názvy „casti_velkeho_textoveho_souboru.aaa“, „casti_velkeho_textoveho_souboru.aab“, atd.
Rozdělování na základě daného počtu řádků se může hodit u textových souborů, ale u ostatních typů je vhodnější zadat požadovanou velikost jednotlivých částí souboru. To se dělá pomocí přepínače -b, kterému můžete zadat celočíselnou hodnotu (počet bytů), případně za ni doplnit znak „k“, když chcete zadat počet kilobytů, nebo „m“ pro práci s megabyty.
# rozdělí soubor po 100 MB (2^20 B) na „iso.a“, „iso.b“, „iso.c“, atd. split -a 1 -b 100m velky_binarni_soubor.iso iso.
Tolik tedy ke standardní verzi. GNU verze, jak bývá zvykem, přináší pár rozšíření. Přepínač -b rozeznává více přípon. K, M, G, T, P, E, Z, Y jsou mocniny dvojky (běžně používané v informace), přičemž KB, MB, GB, TB, PB, EB, ZB a YB jsou mocniny deseti podle SI.
# rozdělí „soubor“ po 2 GB (2*2^30 B) na „xaa“, „xab“, atd. split -b 2G soubor
Přepínač -C (--line-bytes) se hodí pro použití s textovými soubory. Zadáte mu počet bytů (podporuje i přípony jako -b) a split
potom rozdělí vstupní soubor tak, že se do každého výstupního souboru zapíše tolik řádků, kolik je možné, aniž by byla daná velikost překročena. Obsahuje-li soubor řádek delší, než je zadaná velikost, daný řádek bude rozdělen do více souborů.
# rozdělí „soubor.txt“ tak, aby v každé části byl co největší počet # kompletních řádků, který se vejde do 2 MB split -C 2M soubor.txt
A nakonec můj oblíbený přepínač -d (--numeric-suffixes), který zajistí, aby se v příponě místo znaků používaly číslice.
# rozdělí „soubor.mp3“ po 1 GB na „soubor.mp3.001“, „soubor.mp3.002“, atd. split -a 3 -d -b 1G soubor.mp3 soubor.mp3.
Rozdělené soubory lze pak velice snadno spojit pomocí příkazu cat.
cat „soubor.mp3.001“ „soubor.mp3.002“ „soubor.mp3.003“ > „soubor.mp3“ # zkrácená verze téhož cat soubor.mp3.* > soubor.mp3
dd
je program, jehož hlavním účelem je nízkoúrovňové kopírování a konverze surových dat. Původ tohoto nástroje je zvláštní. Název dd je „zkratkou“ convert and copy
, přičemž někde se lze dočíst, že to není „cc“ (jak by se dalo očekávat) právě proto, že takto se jmenuje kompilátor. Říká se, že netradiční syntaxe tohoto programu (ve stylu parametr=hodnota) je parodie na IBM JCL.
Lidé si z dd
občas utahují a říkají, že je zkratkou „data destroyer“ (ničitel dat) nebo „delete data“ (smazat data), jelikož stačí omylem prohodit parametry a můžete tak snadno přijít o data. Vlastně klidně o celý oddíl. Opatrnost se tedy vyplatí.
Hlavní parametry jsou if
a of
, přičemž pomocí if
se zadává vstupní soubor (input file) a pomocí of
tedy výstupní soubor (output file). Další důležité parametry jsou bs
(určuje velikost vstupních i výstupních bloků, výchozí je 512 bytů) a conv
(přes ten se zadává, jak chceme soubor zkonvertovat). Ukážeme si, jak pomocí dd
zkopírovat obraz ISO z CD-ROM:
dd if=/dev/cdrom of=CD.iso bs=2048 conv=sync,notrunc
Tento příkaz čte ze zařízení /dev/cdrom po 2 kB a zapisuje přečtená data do souboru CD.iso v aktuálním adresáři. Argument sync
parametru conv
zajistí doplnění každého vstupního bloku na velikost vstupního bufferu (zadaného v tomto případě přes parametr bs
). Argument notrunc
téhož parametru zabraňuje zkrácení případného existujícího výstupního souboru CD.iso (tj. pokud CD.iso již existuje, bude se obsah nahrazovat postupně od začátku přepisováním souboru).
Parametr count
umožňuje zadat počet vstupních bloků, které se mají zkopírovat. Implicitně se kopírují všechny.
# vytvoří 10 MB velký soubor plný nul dd if=/dev/zero of=nuly.txt bs=1024k count=10
Dále si představíme parametry skip
a seek
. Parametr skip
přeskočí daný počet vstupních bloků, než začne kopírovat vstupní soubor. Parametr seek
přeskočí daný počet výstupních bloků ve výstupním souboru a teprve potom začne zapisovat. Umožňuje tak vytvářet tzv. řídké soubory (sparse files):
# vytvoří 1 GB soubor, který ve skutečnosti nezabírá žádné místo, # protože je prázdný (řídký) dd if=/dev/zero of=sparse_file bs=1 count=0 seek=1G # zkopíruje druhých 512 bytů (tj. byty 513 až 1024) dd if=/dev/sda of=file bs=512 skip=1 count=1
Velikost vstupních a výstupních bloků lze nastavit najednou pomocí bs
, jak jsme si již řekli, ale v případě potřeby lze nastavit obě hodnoty zvlášť pomocí ibs
(vstup) a obs
(výstup).
Parametr conv
podporuje více možností převodu dat, než jsme si zatím ukázali. Například argument ucase
převede malá písmena na velká (a lcase
naopak velká na malá), swap
prohodí každý pár vstupních bytů. Argument noerror
zajistí pokračování i v případě chyb, přičemž v kombinaci se sync
se chybné byty nahradí nulovými (jinak jsou vynechány). Argument ascii
převede (standardní) EBCDIC na ASCII, přičemž ebcdic
udělá opak. Argument ibm
slouží k převodu ASCII do IBM EBCDIC.
# převede ve vstupním souboru malá písmena na velká dd if=soubor1 of=soubor2 conv=ucase
GNU dd
podporuje výpis statistik přenosu za běhu programu. Lze toho docílit posláním signálu SIGUSR1. Když počítáte dopředu s tím, že byste toho chtěli využít, je dobré pustit dd
na pozadí a rovnou si uložit PID procesu do proměnné.
# zkopíruje oddíl (sda1) na jiný (sdb1) dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=notrunc,noerror & # uloží PID naposledy spuštěného procesu na pozadí do proměnné „PID“ PID=$! # každých 10 sekund vypíše statistiku while kill -USR1 $PID 2> /dev/null; do sleep 10 done
Existují zvláštní verze dd
, které jsou specializované na
zachraňování dat z poškozených disků, atp. Jde například o GNU ddrescue nebo
dd_rescue. Port na Windows je k dispozici též.
watch killall -USR1 dd
výhoda je, že se to snadněji pamatuje a je možné to pustit jednou a bude to fungovat pro všechny dd, dokud se to nevypne.
Pro pokročilejší bych doplnil, že bez zadání if a/nebo of se použije standardní vstup/výstup. To sice degraduje dd na úroveň cat, ale třeba při práci s blokovými zařízeními je cat trochu problematický ssh root@nekde 'dd if=/dev/sda bs=1M' | dd of=/dev/sda bs=1M
Každopádně před každým použitím dd doporučuju pořádně zkontrolovat argumenty, přesně podle starého japonského přísloví z dynastie Ming "dvakrát měř, jednou dd".
while true ; do sleep 2 ; prikaz ; done ;
, ale jinak je to opravdu užitečný prográmek. Mé oblíbené je watch cat /proc/mdstat
You can watch for your administrator to install the latest kernel with watch uname -r
Vynulovat nepoužité části NTFS disku se jinak dá i z již nainstalovaných Windows, je na to program 'sdelete.exe' (dříve sysinternals, dnes Microsoft).Nebo opět to dd -
dd if=/dev/zero of=/mnt/ntfs/bigfile
Obsahuje-li soubor řádek delší, než je zadaná velikost, daný řádek bude rozdělen do více souborů.a tohle:
# rozdělí „soubor.txt“ tak, aby v každé části byl co největší početsi protireci.
# kompletních řádků, který se vejde do 2 MB
dd if=input bs=X |dd of=output bs=Xbude vyrazne rychlejsi oproti jedno-procesovemu
dd if=input of=output bs=X
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.