Tips en Trucs 2014

Bestanden in verschillende delen opsplitsen

Introductie

Als je nog nooit van de opdracht split hoorde, mis je een hoop. De split opdracht splits (zoals de naam doet vermoeden) bestanden in kleinere bestanden. Split werkt zowel met tekst- als binaire bestanden. Dit is handig om grote bestanden die je niet op een opslagapparaat (met FAT geformatteerde USB stick) kunt opslaan, eerst te splitsen in kleinere bestanden die je wel kunt opslaan. Dit is ook handig om grote bestanden via bijvoorbeeld e-mail waarbij de bijlage's maar een beperkte grootte mogen hebben, te verzenden. Een andere toepassing is het splitsen van logbestanden om deze vlotter te kunnen verwerken.

Veel gebruikte opties

-b, --bytes=SIZE
Bepaalt de grootte van de geproduceerde bestanden
-d, --numeric-suffixes
Gebruik voor de achtervoegsels getallen in plaats van letters
-n, --number=CHUNKS
Maak CHUNKS (aantal) geproduceerde bestanden

Splits bestanden op basis van de grootte van de geproduceerde bestanden

Standaard krijgen de gesplitste deelbestanden een naam die begint met x en gevolgd wordt door 2 letters. Het eerste bestand krijgt de naam xaa, gevolgd door xab, xac en de laatste xzz. In dit geval kan een bestand gesplitst worden in maximaal 676 (26 x 26) deelbestanden. In het voorbeeld werken we met een 10 MB groot bestand:

dany@linux-att3:~> mkdir test
dany@linux-att3:~> cd test
dany@linux-att3:~/test> dd if=/dev/zero of=bestand bs=10M count=1
1+0 records gelezen
1+0 records geschreven
10485760 bytes (10 MB) gekopieerd, 0,00717586 s, 1,5 GB/s
dany@linux-att3:~/test> ls -lh bestand 
-rw-r--r-- 1 dany users 10M 11 apr 14:50 bestand

Nu kunnen we dit bestand splitsen in deelbestanden met een grootte van 1 MB:

dany@linux-att3:~/test> split -b 1M bestand 
dany@linux-att3:~/test> ls -lh
totaal 20M
-rw-r--r-- 1 dany users  10M 11 apr 14:50 bestand
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xaa
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xab
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xac
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xad
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xae
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xaf
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xag
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xah
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xai
-rw-r--r-- 1 dany users 1,0M 11 apr 15:02 xaj

Splits bestanden op basis van het aantal te produceren bestanden

In sommige situaties wil je een vast aantal deelbestanden verkrijgen. Het volgende voorbeeld maakt maximaal 3 deelbestanden aan:

dany@linux-att3:~/test> rm xa?
dany@linux-att3:~/test> split -n 3 bestand 
dany@linux-att3:~/test> ls -lh
totaal 21M
-rw-r--r-- 1 dany users  10M 11 apr 14:50 bestand
-rw-r--r-- 1 dany users 3,4M 11 apr 15:08 xaa
-rw-r--r-- 1 dany users 3,4M 11 apr 15:08 xab
-rw-r--r-- 1 dany users 3,4M 11 apr 15:08 xac

Achtervoegsels met getallen

Het volgende voorbeeld maakt voor elke letter in het woord pindanet.be een bestand aan. De truc bestaat uit het splitsen van een bestand op basis van 1 byte wat overeenkomt met 1 letter. We gebruiken daarbij getallen als achtervoegsel:

dany@linux-att3:~/test> rm *
dany@linux-att3:~/test> echo pindanet.be | split -b 1 -d
dany@linux-att3:~/test> ls
x00  x01  x02  x03  x04  x05  x06  x07  x08  x09  x10  x11
dany@linux-att3:~/test> cat *
pindanet.be

Het oorspronkelijk bestand herstellen

Een bestand splitsen is eenvoudig, maar hoe herstel je het originele bestand uit de deelbestanden. Laten we een ISO bestand in twee splitsen:

dany@linux-att3:~/test> rm x??
dany@linux-att3:~/test> split -n 2 openSUSE-13.1-DVD-x86_64.iso                 
dany@linux-att3:~/test> ls -lh
totaal 8,6G
-rw-r--r-- 1 dany users 4,3G 21 nov 12:11 openSUSE-13.1-DVD-x86_64.iso
-rw-r--r-- 1 dany users 2,2G 11 apr 15:24 xaa
-rw-r--r-- 1 dany users 2,2G 11 apr 15:24 xab

Nu kunnen we de deelbestanden samenvoegen om het originele bestand te herstellen:

dany@linux-att3:~/test> cat x* > hersteld-openSUSE-13.1-DVD-x86_64.iso

Om te weten of het herstelde ISO bestand een exacte replica is van het oorspronkelijke bestand berekenen we voor beiden de md5sum, deze moet voor beide bestanden dezelfde zijn:

dany@linux-att3:~/test> md5sum *.iso
1096c9c67fc8a67a94a32d04a15e909d  hersteld-openSUSE-13.1-DVD-x86_64.iso
1096c9c67fc8a67a94a32d04a15e909d  openSUSE-13.1-DVD-x86_64.iso

Zoals je merkt zijn beide bestanden precies hetzelfde.

Een archief bij het aanmaken splitsen

Nu we de basis kennen, kunnen we een uitgebreider voorbeeld bekijken: het splitsen van een archief tijdens het aanmaken van het archief. In het voorbeeld maken we een gecomprimeerd archief van de map /tmp/dumps. Het archief wordt tijdens het aanmaken gesplitst in deelbestanden:

dany@linux-att3:~/test> rm *
dany@linux-att3:~/test> du -sh /tmp/dumps/
1,9M    /tmp/dumps/
dany@linux-att3:~/test> tar cz /tmp/dumps/ | split -b 100K
tar: Leidende '/' wordt uit lidnamen weggelaten
dany@linux-att3:~/test> ls -lh
totaal 272K
-rw-r--r-- 1 dany users 100K 11 apr 15:45 xaa
-rw-r--r-- 1 dany users 100K 11 apr 15:45 xab
-rw-r--r-- 1 dany users  72K 11 apr 15:45 xac

Zoals je merkt, bestaat het archief uit drie deelbestanden met een maximale grootte van 100 KB. De originele map herstellen, gaat als volgt:

dany@linux-att3:~/test> cat * | tar xz
dany@linux-att3:~/test> ls
tmp  xaa  xab  xac
dany@linux-att3:~/test> du -sh tmp/dumps/
1,9M    tmp/dumps/

Slotwoord

De mogelijkheden van de split opdracht worden enkel beperkt door uw kennis en verbeelding. De noodzakelijke kennis kan je bijschaven met behulp van de manual (man split), de verbeelding wordt bepaald door uw ervaringen en aanleg.
Split manual