<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Je to divočina &#187; Bash</title>
	<atom:link href="http://blog.urbasek.cz/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.urbasek.cz</link>
	<description>Práce na volné noze je divočina! Na tomto blogu publikuji zápisky ze svého safari. Ve zbývajícím čase programuji aplikace pro iPhone.</description>
	<lastBuildDate>Fri, 29 Nov 2013 15:44:55 +0000</lastBuildDate>
	<language>cs-CZ</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Automatické zálohování dat na Mac OS X</title>
		<link>http://blog.urbasek.cz/automaticke-zalohovani-dat-na-mac-os-x/</link>
		<comments>http://blog.urbasek.cz/automaticke-zalohovani-dat-na-mac-os-x/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 17:25:34 +0000</pubDate>
		<dc:creator><![CDATA[JIří Urbášek]]></dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Programování]]></category>

		<guid isPermaLink="false">http://blog.urbasek.cz/?p=80</guid>
		<description><![CDATA[Zálohování dat je bezesporu velmi důležitá věc. Většina lidí pracujích hodně s počítačem, se dostane jednou do chvíle, že pro ně začnou být jejich data cenná a začnou přemýšlet o jejich zálohování. Nejlépe pravidelném. I já mezi ně patřím a jelikož jsem člověk docela líný, rozhodl jsem si tuto činnost co nejvíce usnadnit &#8211; napsal...<br /><a class="more-link" href="http://blog.urbasek.cz/automaticke-zalohovani-dat-na-mac-os-x/">Continue reading &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Zálohování dat je bezesporu velmi důležitá věc. Většina lidí pracujích hodně s počítačem, se dostane jednou do chvíle, že pro ně začnou být jejich data cenná a začnou přemýšlet o jejich zálohování. Nejlépe pravidelném. I já mezi ně patřím a jelikož jsem člověk docela líný, rozhodl jsem si tuto činnost co nejvíce usnadnit &#8211; napsal jsem si skritpt v bashi, který potřebnou rutinu vykoná za mě.<br />
<span id="more-80"></span></p>
<h2>Co je to Bash?</h2>
<p>Jsem uživatelem operačního systému Mac OS X a tudíž můžu s výhodou použít mocného nástroje zvaného Bash. K tomuto nástroji se dostaneme spuštěním aplikace Terminál. Vyskočí na vás sice jen černé nic neříkající okno, ale nenechte se odradit, v tuto chvíli se opravdu stáváte pánem (paní) svého počítače. Terminál totiž dokáže poslouchat příkazy, které mu zadáte, a podle nich udělat snad vše, na co si vzpomenete &#8211; a ještě mnohem víc. Stačí tedy jen vědět, co mu chcete přikázat.</p>
<h2>Zálohování souborů pomocí terminálu</h2>
<p>Jakožto bývalý uživatel Linuxu jsem stále ještě docela zběhlý v používání příkazové řádky (terminálu) a používám ji velmi rád. Je prostě rychlejší a mocnější.</p>
<p>Obvykle jsem zálohoval svá data vždy jednou za čas, když se mi prostě chtělo. Většinou jsem to dělal posloupností několika příkazů. Dejme tomu, že jsem si chtěl zálohovat složku se svými dokumenty do školy.</p>
<pre lang="bash">tar czf `date +"%Y-%d-%m"`.School.tar.gz School
mv [[datum]].School.tar.gz ~/Backup/</pre>
<p>A poté jsem si chtěl zálohovat další složku, například veškerou svoji práci.</p>
<pre lang="bash">tar czf `date +"%Y-%d-%m"`.School.tar.gz School
mv [[datum]].School.tar.gz ~/Backup/</pre>
<h3>Jde to i jednodušeji &#8211; skriptováním</h3>
<p>Skriptování zní jako něco velmi složitého, určeného pouze těm divným lidem, kteří rozumí jedničkám a nulám. Ale ve skutečnosti to vůbec složité není. Skript v Bashi je jen posloupnost příkazů &#8211; nemusíte je psát každý zvlášť, ale zapíšete si je všechny do jednoho souboru a ten si poté spustíte. Jak jednoduché&#8230;</p>
<h2>Konečně řešení</h2>
<p>Takže jsem nelenil, využil chvilky volnějšího času a pustil se do skriptování. Mým cílem bylo vytvořit skript, kterému pouze předám soubory, které chci zálohovat, a on se již o vše ostatní postará. Pojmenoval jsem si ho <code>backup.sh</code>.</p>
<pre lang="bash">#!/bin/bash

backupStorage=/Users/jirka/Backup/

# print usage info
usage() {
    echo -e "`basename $0` usage:"
    echo -e "`basename $0` backup_file [ backup_file, ... ]"
    echo -e "`basename $0` default backup storage is '$backupStorage'"
}

# do backup by creating tar.gz file and place it into desired folder
# arg1: path to file to backup
# arg2: path where to place backuped file
backup() {
    if [ $# -lt 2 ] &amp;&amp; ([ ! -f $1 ] || [ ! -d $i ]) || [ ! -d $2 ]; then
        echo -e "$@"
        usage $@
        exit 4
    fi
    date=`date +"%Y-%m-%d"`
    fileName=`basename $1`.tar.gz

    echo $fileName
    tar czf /tmp/$fileName $1

    if [ ! -d $2$date ]; then
        mkdir $2$date
    fi

    mv /tmp/$fileName $2$date
}

# run the script
if [ ! -d $backupStorage ]; then
    echo -e "`basename $0`: backuping storage '$backupStorage' does not exist"
    exit 2
fi

if [ $# -lt 1 ]; then
    usage $@
    exit 2
fi

for i in $@; do
    if [ -f $i ] || [ -d $i ]; then
        backup $i $backupStorage
    else
        echo -e "`basename $0`: file '$i' does not exist"
    fi
done</pre>
<p>Nyní si můžu jednoduše zálohovat své soubory jediným příkazem. Nesmím však zapomenout přidat soubor práva na spouštění.</p>
<pre lang="bash">chmod u+x backup.sh
./backup.sh School Work Photos Documents/ImportantFile.txt</pre>
<p>Ve skriptu je pro uložení mých zálohovaných soborů nadefinována složka <code>Backup</code> v mém domovském adresáři. Po úspěšném ukončení skriptu se v ní vytvoří podsložka pojmenovaná podle aktuálního data a v ní všechny zálohované soubory zabalené do archivu <code>tar.gz</code>.</p>
<h2>Zálohování skutečně automaticky</h2>
<p>Ti bystřejší pochopili, že tohle stále ještě není automatické zálohovaní. Pořád tu musí být někdo, kdo celý skript spustí. Ale i tento problém se dá snadno vyřešit. Mac OS X nám totiž nabízí automatické spouštění skriptů a to v podstatě kdykoliv si usmyslíte &#8211; buďto jen určitý den v měsíci v určitou hodinu nebo třeba v pravidelných intervalech. Řekněme, že budeme chtít spouštět náš zálohovací skript každý týden. K tomuto účelu nám slouží složka <code>/etc/periodic/weekly</code> (v linuxu známá jako <code>/etc/cron.weekly</code>) Zde se umisťují skripty, které chceme, aby se automaticky spustily každý týden. Bohužel takovýto automatický skript neumí přijmout žádné parametry, takže je potřeba ještě malé úpravy &#8211; vytvoření dalšího skriptíku.</p>
<p>Chci si každý týden zálohovat své pracovní dokumenty, fotky a školu. Svůj skript jsem si umístil v domovském adresáři ve složce <code>bin</code>.</p>
<pre lang="bash">#!/bin/bash
/Users/jirka/bin/backup.sh /Users/jirka/School /Users/jirka/Work /Users/jirka/Photos
chown -R jirka:jirka /Users/jirka/Backup/`date +"%Y-%m-%d"`</pre>
<p>Tento kód si uložíme do souboru a soubor umístíme do výše zmíněné složky (opět je nutné přidělit práva na spouštění pomocí příkazu <code>chmod</code>). Tohe už jsem ale netestoval, takže nemohu zaručit dokonalou funkčnost. Já si své zálohy budu spouštět kdy chci sám a hlavně si vyberu pokaždé různé soubory, které chci zálohovat.</p>
<h2>Závěrem</h2>
<p>Skript není dokonalý. Obsahuje pár nedostatků. Konkrétně, jméno zálohovaného souboru se zjišťuje podle posledního <em>názvu</em> v dané cestě k souboru. Například <code>/Users/jirka/documents/soubor.txt</code> bude zálohován jako <code>soubor.txt.tar.gz</code>. To tedy znamená, že pokud skriptu předáme dva různé soubory, které ale končí stejně, např. <code>School/predmet1/prednaska.pdf</code> a <code>School/predmet2/prednaska.pdf</code>, bude zálohován pouze jeden z nich &#8211; ten poslední.<br />
Druhá nevýhoda je, že skript nefunguje správně pro soubory obsahující ve svém názvu mezery (na tohle už mé skriptovací schopnosti zřejmě nestačí).</p>
<p>Také je nutné upozornit, že zálohovaná data samozřejmě musí být jinde, než na počítači, který je zálohován. Takže na úplný závěr je potřeba si všechny soubory z zálohovacího uložiště skopírovat na flash disk, vypálit na CD, nebo jako <code>backupStorage</code> ve skriptu nadefinovat cestu k připojenému externímu disku. Externí disky na Mac OS X jsou vždy připojeny do složky <code>/Volumes</code>.</p>
<p></p>]]></content:encoded>
			<wfw:commentRss>http://blog.urbasek.cz/automaticke-zalohovani-dat-na-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
