backuptousb
Pakkar mapper rett ned på ein ekstern disk som eitt komprimert arkiv per mappe. Skrive fordi kopiering av mange små filer til USB er tregt på ein måte som ikkje gir meining før du veit kvifor.
Problemet det løyser
Dra ei mappe med 50 000 småfiler over på ein minnepenn, og du får 2 MB/s på ein disk som fint klarar 100. Det er ikkje disken som er treg. Kvar einaste fil tyder ein runde med opne, skrive, lukke, og det er dei rundane du ventar på, ikkje sjølve dataa.
Eitt arkiv er éin samanhengande straum av byte. Då får du full diskfart. Det er heile trikset, og tar har kunna det i førti år. Dette scriptet pakkar det berre inn i noko du orkar å bruke dagleg, med framdrift, sikringar og fornuftige standardval.
Kom i gang
Last ned fila, gjer henne køyrbar, og legg gjerne inn eit alias så ho er tilgjengeleg overalt:
$ chmod +x ~/scripts/backuptousb $ echo "alias backuptousb='~/scripts/backuptousb'" >> ~/.bashrc $ source ~/.bashrc
Opne så fila og set standard målmappe øvst, i EDIT ME-blokka. Det er den einaste innstillinga dei fleste treng å røre:
DEFAULT_DEST="/media/youruser/usbdiskname/backups" # kvar arkiva hamnar COMPRESSION="zstd" # zstd | gzip | none ZSTD_LEVEL="3" # 1-19; 3 er raskt og bra DATESTAMP="no" # yes -> claude-20260716.tar.zst
Bruk
Køyr det frå mappa over det du vil pakke. Scriptet krev relative stiar nettopp difor: då inneheld arkivet myproject/…, og du kan pakke det ut kvar som helst utan å dra med deg /home/deg/ inn i arkivet.
backuptousb mappe/Pakkar éi mappe. Trykk Enter for å godta framlegget til filnamn.backuptousb a/ b/ c/Eitt arkiv per mappe. Du blir spurd om målmappa éin gong, så går resten utan avbrot.backuptousb notes.txtEnkeltfiler går like fint som mapper.-yIngen spørsmål. Bruker standardmappa. For cron og script.-o <sti>Overstyrer namn og plassering for eitt enkelt arkiv.-hSkriv ut heile kommentarblokka frå toppen av fila.Ei vanleg køyring
Her blir ei prosjektmappe og ei laus fil pakka i same slengen. Legg merke til at node_modules aldri blir talt med. Mappa inneheldt 53 filer, scriptet pakkar 55 oppføringar (filer pluss katalogar) og hoppar over resten:
$ cd ~ $ backuptousb myproject/ notes.txt 2 sources to back up: myproject/ -> myproject.tar.zst notes.txt -> notes.txt.tar.zst Destination folder (Enter to accept): /media/youruser/usbdiskname/backups [1/2] myproject/ Packing myproject/ -> /media/youruser/usbdiskname/backups/myproject.tar.zst Sizing... 55 files, 220K 100% 00:00 taken Flushing to disk... done Source 220K (55 files) Archive 689 -> /media/youruser/usbdiskname/backups/myproject.tar.zst Shrunk to 0.3% of original Time 0m 0s Speed (too fast to measure) [2/2] notes.txt Packing notes.txt -> /media/youruser/usbdiskname/backups/notes.txt.tar.zst Sizing... 1 files, 4.0K 100% 00:00 taken Flushing to disk... done Source 4.0K (1 files) Archive 102 -> /media/youruser/usbdiskname/backups/notes.txt.tar.zst Shrunk to 2.4% of original Time 0m 0s Speed (too fast to measure) ======================================== 2 of 2 sources packed 224K -> 791 in 0m 0s ======================================== Scripts on the backup disk: + /media/youruser/usbdiskname/backups/backuptousb + /media/youruser/usbdiskname/backups/extracttodisk To restore: /media/youruser/usbdiskname/backups/extracttodisk <archive.tar.zst>
På ekte data ser tala sjølvsagt annleis ut. Ei 60 GB mappe bruker minutt, ikkje sekund, og då er det ETA-en i framdriftslinja du følgjer med på. Poenget med utskrifta er at du får sjå kva som faktisk skjedde: kor mykje som blei lese, kor stort arkivet blei, og kvar det ligg.
Når arkivet finst frå før
Køyrer du på nytt over eit arkiv som alt finst, får du tala for begge før du bestemmer deg. Ikkje berre «fila finst, skrive over?», men kor gammalt det gamle arkivet er og kor stor kjelda er no:
myproject.tar.zst already exists: existing archive 689 packed 2026-08-05 12:15 myproject/ source now 220K (55 files, uncompressed) Overwrite? [y/N] _
Sikringane
Ei avbroten køyring øydelegg ikkje det du hadde
tar skriv normalt rett i målfila. Blir køyringa drepen halvvegs, sit du att med ei avkorta fil under det rette namnet, ein backup som ser ut som ein backup, men ikkje er det. Dette scriptet pakkar alltid til arkiv.tar.zst.partial først, og gir henne det endelege namnet berre etter at tar har avslutta reint. Ctrl-C, straumbrot eller full disk gjer at den halve fila blir rydda bort og det førre, heile arkivet blir ståande urørt.
Éi uleseleg fil stoppar ikkje ein 60 GB backup
Dette er ikkje teori. Ei rot-eigd fil midt i treet fekk ei 60 GB køyring til å avbryte på 55 GB. No køyrer tar med --ignore-failed-read: uleselege filer blir hoppa over, talde opp på skjermen, og lista i ein .skipped.log ved sida av arkivet. Køyringa fullfører, og du får vite nøyaktig kva som mangla.
Framdrift som stemmer
Framdriftslinja tel filer, ikkje byte. Byte-basert framdrift blir grovt feil på tre med mange små filer, fordi kvar fil blir runda opp til ein tar-blokk på 512 byte. Målt på eit tre med 20 000 småfiler hoppa ei byte-basert linje frå 38 % rett til 100 %. Filteljing er eksakt uansett filstorleik.
Databasemapper blir hoppa over med vilje. db-data og mysql-data står i ekskluderingslista. Ei levande InnoDB-mappe kopiert under ein køyrande tenar er eit rive augneblinksbilete som fort ikkje lèt seg gjenopprette i det heile. Ta heller ein mariadb-dump ned i prosjektmappa, så blir dumpen med i arkivet som ei heilt vanleg fil.
Kva som ikkje er med
Det finst ingen inkrementell logikk. Kvar køyring les heile kjelda på nytt. Skal du ha «berre det som er endra», er rsync rett verktøy ved sida av dette, ikkje tar.
Scriptet skriv rett til USB. Ryk kabelen midt i, har du ei avkorta fil og ingen lokal kopi. For noko verkeleg kritisk: pakk til lokal disk først, og kopier den eine ferdige fila over etterpå.
Den rå kommandoen bak
Vil du heller skrive det sjølv, er det dette scriptet i praksis gjer:
# pakk $ tar -I 'zstd -3 -T0' -cf /media/youruser/usbdiskname/backups/myproject.tar.zst myproject/ # pakk ut $ tar -I zstd -xf myproject.tar.zst # sjå innhaldet utan å pakke ut $ tar -I zstd -tf myproject.tar.zst | less
Blir ikkje vedlikehalde, endre det sjølv
Dette scriptet er laga til mi eiga maskin og blir lagt ut som det er. Det blir ikkje oppdatert, og eg tek ikkje imot feilmeldingar eller ønske.
Treng du at det gjer noko anna, gi heile fila til Claude, ChatGPT eller ein annan AI og be om endringa med vanlege ord: «legg dato i filnamnet», «bruk gzip i staden for zstd», «skriv til to diskar etter kvarandre», «send meg e-post når det er ferdig». Fila er tett kommentert nettopp for at ein AI skal kunne lese henne og skjøne kvifor koden er som han er. Det var slik han blei til.