Základní příkazy

ls, cd, cp, mv, rm, mkdir, cat, less.

V terminálu se pár desítek příkazů opakuje pořád dokola — a tohle je ta hrstka, kterou fakt použiješ každý den. Orientace (kde jsem, co tu je), práce se soubory (kopíruj, přesuň, smaž) a prohlížení obsahu. Až je budeš mít v prstech, přestaneš o terminálu přemýšlet a začneš v něm žít. Jedno varování hned na začátek: Linux nemá koš. Když smažeš, je to pryč. Proto to tady bereme s respektem.


Pár pojmů na úvod

  • Pracovní adresář (working directory) = složka, ve které zrovna „stojíš". Většina příkazů pracuje relativně k němu — když napíšeš ls, vypíše obsah tady, ne někde jinde.
  • Cesta (path) = adresa souboru. Absolutní začíná lomítkem od kořene (/home/petr/soubor.txt), relativní vychází z místa, kde stojíš (soubor.txt, ../nahoru).
  • . a .. = zkratky. . je „tady" (aktuální složka), .. je „o patro výš" (nadřazená složka).
  • ~ (vlnovka, tilde) = tvůj domovský adresář, typicky /home/tvojejmeno. cd ~ tě vždy vrátí domů.
  • Přepínač / flag = písmenko za pomlčkou, které mění chování příkazu (ls -l, rm -r). Dají se spojovat: ls -la = ls -l -a.
  • Argument = to, na čem má příkaz pracovat (cp zdroj cíl). Přepínače říkají jak, argumenty co.

Orientace — kde jsem a co tu je

Tři příkazy, které mačkáš nejčastěji ze všech. „Kde jsem?", „Co tu leží?", „Přesuň mě jinam."

pwdprint working directory, vypíše, kde právě stojíš:

$ pwd
/home/petr/dokumenty

lslist, vypíše obsah aktuální složky:

$ ls
faktury  poznamky.txt  fotky  todo.md

Samotný ls je ale strohý. Skutečná síla je v přepínačích:

  • -llong, dlouhý výpis: práva, vlastník, velikost, datum úpravy — jeden soubor na řádek.
  • -aall, ukáže i skryté soubory (ty, co začínají tečkou, např. .bashrc).
  • -hhuman-readable, velikosti čitelně (4.0K, 2.3M, 1.1G) místo holých bajtů.

Nejužitečnější je je zkombinovat:

$ ls -lah
celkem 24K
drwxr-xr-x 4 petr petr 4.0K 12. čec 09:14 .
drwxr-xr-x 8 petr petr 4.0K 10. čec 18:02 ..
-rw-r--r-- 1 petr petr  220 10. čec 18:02 .bashrc
drwxr-xr-x 2 petr petr 4.0K 12. čec 09:10 faktury
-rw-r--r-- 1 petr petr 1.2K 12. čec 09:14 poznamky.txt

První písmeno v levém sloupci prozradí typ: d = adresář (directory), - = obyčejný soubor. Řádky . a .. jsou samotná složka a její rodič — proto se objeví, jen když přidáš -a.

cdchange directory, přesune tě jinam:

cd faktury        # o složku níž (relativně)
cd /etc           # kamkoli (absolutní cesta)
cd ..             # o patro výš
cd ~              # domů (nebo jen samotné `cd`)
cd -              # zpět do předchozí složky (jako „back" v prohlížeči)

💡 Ztratil ses? pwd ti vždy řekne, kde jsi, a cd ~ tě dostane domů. Tyhle dva se nedají „rozbít".


Práce se soubory a složkami

mkdirmake directory, vytvoří složku. Přepínač -p vytvoří i všechny chybějící mezisložky naráz (a nezanadává, když už existuje):

mkdir projekt                    # jedna složka
mkdir -p projekt/kod/src/utils   # celá cesta naráz, i kdyby nic z toho neexistovalo

Bez -p by mkdir projekt/kod/src selhal, pokud projekt/kod ještě neexistuje. Proto se -p používá skoro pořád.

touch — vytvoří prázdný soubor (nebo aktualizuje čas úpravy u existujícího):

touch todo.md          # prázdný soubor
touch a.txt b.txt      # rovnou několik

cpcopy, kopíruje. Nejdřív zdroj, pak cíl. Na složky musíš přidat -r (recursive — „vezmi to i s obsahem"):

cp poznamky.txt zaloha.txt       # kopie souboru pod novým jménem
cp poznamky.txt ~/dokumenty/     # soubor do jiné složky (jméno zůstane)
cp -r projekt projekt-zaloha     # celá složka i s obsahem

mvmove, přesun i přejmenování (v Linuxu je to jedna a ta samá operace — jen změníš, kde soubor „bydlí" a jak se jmenuje). Žádné -r nepotřebuje ani na složky:

mv koncept.txt hotovo.txt        # přejmenování (zůstává na místě)
mv hotovo.txt ~/dokumenty/       # přesun jinam (jméno zůstane)
mv fotky/ ~/obrazky/             # přesun celé složky

rmremove, maže. Tady buď opatrný (celá sekce o tom je níž). Na složky opět -r:

rm starysoubor.txt       # smaže soubor
rm -r stara-slozka       # smaže složku i s obsahem
rm -i dulezite.txt       # -i = zeptá se před smazáním (interactive)

rmdir — smaže složku, ale jen když je prázdná. Je to vlastně „bezpečná" varianta — když tam něco zůstalo, rmdir odmítne a tím tě chrání:

rmdir prazdna-slozka     # OK
rmdir slozka-s-obsahem   # chyba: „Directory not empty" — nic nesmaže

💡 Malý mentální model: cp = zůstane originál i kopie, mv = originál se přesune (nezdvojí se), rm = zmizí. -r znamená „ponoř se i do podsložek" a potřebuješ ho vždy, když pracuješ se složkou.


Prohlížení obsahu souborů

catconcatenate, vysype celý obsah souboru do terminálu naráz. Skvělé na krátké soubory:

$ cat poznamky.txt
Nakoupit mléko
Zavolat instalatérovi
Deploy v pátek

Na velký soubor (log o tisících řádcích) je cat nepraktický — proletí ti obrazovkou a nic nepřečteš. Od toho je less.

less — otevře soubor v stránkovači: můžeš rolovat nahoru/dolů a soubor se ti nevyleje do terminálu. Ovládání:

  • šipky / PageUp / PageDown — posun
  • /hledanytext + Enter — hledání (další výskyt n, předchozí N)
  • g skok na začátek, G na konec
  • q — konec (vrátí tě zpět do terminálu)
less /etc/services       # pohodlně prolistuješ i obří soubor (existuje všude)

🚩 Nováčci se v less „zaseknou" a nevědí ven — pamatuj jediné písmeno: q jako quit.

head a tail — ukážou jen začátek, resp. konec souboru (výchozí 10 řádků). -n mění počet:

head poznamky.txt        # prvních 10 řádků
head -n 3 poznamky.txt   # první 3 řádky
tail -n 20 chyby.log     # posledních 20 řádků

Nejmocnější trik má tail: přepínač -f (follow) — nechá soubor otevřený a živě dopisuje nové řádky, jak přibývají. Nepostradatelné na sledování logů běžící aplikace:

tail -f /var/log/aplikace.log    # necháš běžet a koukáš, co appka „říká" v reálném čase

tail -f se ukončí Ctrl+C.


Hledání souborů a wildcardy

Než sáhneš po find, znej wildcardy (žolíky) — to je zástupné znakování, které rozbaluje sám shell ještě před spuštěním příkazu. Fungují napříč všemi příkazy (ls, cp, rm…):

  • * — libovolný počet znaků (i nula). *.txt = všechny soubory končící .txt.
  • ? — právě jeden libovolný znak. soubor?.txt sedí na soubor1.txt, souborA.txt, ne na soubor12.txt.
  • [ ] — jeden znak z množiny. foto[123].jpg = foto1.jpg, foto2.jpg, foto3.jpg.
ls *.log                 # všechny logy ve složce
cp foto?.jpg zaloha/     # foto1.jpg, foto2.jpg… naráz do zálohy
rm *.tmp                 # smaže všechny .tmp soubory (opatrně!)

💡 Důležité pochopení: rozbalení dělá shell, ne příkaz. Když napíšeš ls *.txt, shell to nejdřív nahradí seznamem skutečných souborů a ls už dostane hotový seznam. Proto * funguje všude stejně.

find — hledá soubory podle jména, typu, velikosti, stáří… i v podsložkách. Základní forma je „kde hledat" + „podle čeho":

find . -name "*.log"             # všechny .log soubory od aktuální složky (.) dolů
find /etc -name "*.conf"         # konfiguráky pod /etc
find . -type d -name "cache"     # jen složky (-type d) jménem cache
find . -name "*.tmp" -delete     # najde a rovnou smaže (opatrně!)

Uvozovky kolem "*.log" jsou důležité: brání shellu, aby si * rozbalil sám dřív, než se k němu dostane find. Chceš, aby žolíka dostal find a použil ho na celý strom.


POZOR: kopírování a mazání jsou tiché a nevratné

Tohle si přečti dvakrát. Většina „katastrof v terminálu" se stane přesně tady.

Linux nemá koš. Když v grafickém správci souborů smažeš soubor, jde do koše a dá se vytáhnout zpátky. rm v terminálu maže napřímo — obsah je pryč, žádné „obnovit". Existují forenzní nástroje, ale nespoléhej na ně.

cp a mv tiše přepíšou cíl. Když cílový soubor už existuje, cp source.txt cil.txt ho bez ptaní přepíše — původní cil.txt je nenávratně přepsaný. Stejně tak mv. Žádné „opravdu?".

Přesměrování > taky maže. Zápis prikaz > soubor.txt nejdřív vynuluje soubor.txt (i kdyby příkaz nakonec nic nevypsal). Použití > na existující soubor = jeho původní obsah je pryč. (Chceš-li přidávat na konec místo přepsání, použij >>.)

rm -rf je nejnebezpečnější kombinace, jakou v terminálu napíšeš. -r = ponoř se do všech podsložek, -f = force, mlč a na nic se neptej. rm -rf slozka smaže složku a všechno pod ní bez jediného dotazu. Fatální je, když se do cesty vloudí mezera nebo prázdná proměnná:

rm -rf /home/petr/stare      # OK, smaže jednu složku
rm -rf /home/petr/ stare     # KATASTROFA: mezera navíc → maže celý /home/petr/ !
rm -rf $SLOZKA/*             # když je $SLOZKA prázdná, stane se z toho rm -rf /*

Jak se chránit

  • Přepínač -i (interactive) donutí příkaz zeptat se před každou akcí. Funguje u rm, cp i mv:
    rm -i soubor.txt       # rm: smazat obyčejný soubor 'soubor.txt'? y/n
    cp -i a.txt b.txt      # zeptá se, než přepíše b.txt
    
  • Trvalý alias — přidej si do ~/.bashrc, ať je -i výchozí a systém tě chrání sám od sebe:
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    

    Po restartu terminálu (nebo source ~/.bashrc) se tě rm bude vždycky ptát. Nespoléhej ale na alias na cizích strojích — tam nemusí existovat.
  • Než odešleš rm s žolíkem, nahraď ho ls. ls *.tmp ti ukáže, co by rm *.tmp smazal. Když sedí seznam, teprv pak přepiš ls na rm.

🚩 Zlaté pravidlo: u rm -rf se na chvíli zastav a přečti si celý řádek pozpátku. Ta vteřina navíc tě jednou zachrání před ztrátou dat.


Failure modes — časté omyly začátečníků

  • rm -rf omylem (mezera / prázdná proměnná). Nejčastější skutečná katastrofa. rm -rf /cesta /navic s nechtěnou mezerou maže dvě věci místo jedné. Vždy si řádek přečti, u proměnných je obal do uvozovek (rm -rf "$SLOZKA") a raděj používej -i.
  • Zapomenuté -r u složky. rm slozka nebo cp slozka cil selže s „is a directory". Není to chyba systému — jen ti připomíná, že na složku potřebuješ -r. (Naopak — když -r nechceš, ale zapneš ho, smažeš i to, co jsi nechtěl.)
  • Přepsání souboru přes cp/mv/>. Cíl se přepíše tiše. Zvlášť zákeřné je > — vynuluje soubor ještě předtím, než příkaz vůbec něco vypíše. Používej -i a >> když chceš přidávat.
  • „Kde je koš?" V terminálu žádný není. Smazané rm je pryč. Kdo chce záchrannou síť, ať používá -i, aliasy, nebo nástroj typu trash-cli (trash místo rm), který maže do koše.
  • Zaseknutí v less. Není to zamrznutí — jen stránkovač čeká. Ven se dostaneš písmenem q.
  • Žolík rozbalí něco jiného, než čekáš. rm * v nesprávné složce smaže vše. Vždy nejdřív ls *, pak rm.

🛠️ Cvičení

  1. Postav a zboř strukturu. Jedním příkazem vytvoř složky pokus/a/b/c (nápověda: mkdir má přepínač, co udělá celou cestu naráz). Pak do pokus/a vytvoř prázdný soubor test.txt. Nakonec celý pokus smaž jedním příkazem. Proč na to smazání potřebuješ -r?
  2. Bezpečné mazání žolíkem. Máš složku plnou souborů log1.txtlog9.txt a chceš smazat jen ty logy, ne nic jiného. Jaký příkaz ti nejdřív ukáže, co by se smazalo, a jak ho pak změníš na skutečné mazání? Který wildcard je bezpečnější — log?.txt nebo log*, a proč?
  3. Přejmenuj a přesuň. Máš soubor koncept.txt. Přejmenuj ho na verze1.txt a pak ho přesuň do podsložky hotovo/ (kterou nejdřív vytvoř). Kolik různých příkazů na to potřebuješ a proč je mv na obojí?
  4. Sleduj log naživo. Najdi příkaz, který ti bude v reálném čase vypisovat nové řádky přibývající do souboru /var/log/aplikace.log. Čím ho ukončíš? A jak bys zobrazil jen posledních 20 řádků bez sledování?
  5. Chraň se aliasem. Přidej si do ~/.bashrc alias, aby se rm vždy ptal před smazáním. Jak alias aktivuješ bez zavírání terminálu? Proč se na tenhle alias nesmíš spoléhat na cizím stroji?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Struktura — vytvoření: mkdir -p pokus/a/b/c (-p udělá i chybějící mezisložky naráz). Soubor: touch pokus/a/test.txt. Smazání: rm -r pokus. -r je nutné, protože pokus je složka s obsahem — bez -r rm odmítne mazat adresář. Pozor: rm -r je nevratné, žádný koš — než ho pustíš, mrkni ls, že mažeš správnou věc.
  2. Bezpečné mazání — nejdřív ls log?.txt (ukáže, co sedí), a když seznam odpovídá, přepíšeš na rm log?.txt. log?.txt je bezpečnější: ? sedí na právě jeden znak, takže chytí log1.txtlog9.txt, ale ne třeba log-dulezite-neprepisovat.txt. log* by chytil úplně všechno začínající „log", i to, co jsi nechtěl. Pozor: žolíky rozbaluje shell — vždy si výběr nejdřív ověř ls, teprve pak mazej.
  3. Přejmenuj a přesuň — jde to jedním nástrojem, mv, protože přejmenování i přesun jsou v Linuxu ta samá operace: mkdir hotovo, pak mv koncept.txt verze1.txt (přejmenování), pak mv verze1.txt hotovo/ (přesun). Nebo obojí naráz: mv koncept.txt hotovo/verze1.txt. Pozor: kdyby v cíli verze1.txt už existoval, mv ho tiše přepíše — jisti se přes mv -i.
  4. Sleduj logtail -f /var/log/aplikace.log živě dopisuje nové řádky; ukončíš ho Ctrl+C. Jen posledních 20 řádků bez sledování: tail -n 20 /var/log/aplikace.log. Pozor: tail -f drží terminál obsazený, dokud ho neukončíš — je to záměr (sleduješ), ne zaseknutí.
  5. Alias — do ~/.bashrc přidej řádek alias rm='rm -i'. Aktivace bez zavření terminálu: source ~/.bashrc (načte konfiguraci znovu). Na cizím stroji ten alias neexistuje, takže tam rm maže napřímo bez ptaní — návyk „přečíst řádek než ho pustím" tě ochrání spolehlivěji než alias. Pozor: alias tě uspí do falešného pocitu bezpečí; rm -f navíc -i z aliasu potlačí.

🧠 Otázky & odpovědi

Proč rm nemaže do koše a jak se před tím chránit?

Protože rm je nízkoúrovňový nástroj, který rovnou odpojí soubor od systému souborů — žádná záchranná síť, žádný koš, obsah je pryč a spoléhat na forenzní obnovu se nedá. Je to cena za rychlost a jednoduchost. Chránit se dá třemi způsoby: přepínačem -i (zeptá se před každým smazáním), aliasem alias rm='rm -i' v ~/.bashrc (udělá -i výchozí), nebo nástrojem trash-cli, který maže do skutečného koše. A nejlevnější pojistka: než pustíš rm s žolíkem, nahraď ho ls a podívej se, co by zmizelo.

Kdy potřebuju přepínač -r a co znamená?

-r znamená recursive — „ponoř se do složky a zpracuj i všechno, co je uvnitř". Potřebuješ ho vždy, když stejnou operaci děláš na adresář místo jednoho souboru: rm -r slozka (smaž složku i s obsahem), cp -r slozka kopie (zkopíruj celou složku). Bez -r ti rm i cp na složce odmítnou práci s hláškou „is a directory" — je to pojistka, ať omylem nesmažeš celý strom. Výjimka je mv, které -r nepotřebuje (přesun složky je jen změna adresy, ne procházení obsahu).

Co je to wildcard a kdo ho vlastně zpracovává?

Wildcard (žolík) je zástupný znak, kterým řekneš „všechny soubory, co odpovídají vzoru": * = libovolný počet znaků, ? = právě jeden znak, [ ] = jeden znak z množiny. Klíčové je, že ho rozbaluje shell, ne samotný příkaz — když napíšeš rm *.log, shell nejdřív najde všechny odpovídající soubory a rm už dostane hotový seznam jmen. Proto žolíky fungují napříč všemi příkazy stejně. A proto se u find dává vzor do uvozovek (find . -name "*.log") — chceš, aby si * nechal find, ne aby ho shell rozbalil předčasně.

Jak si přečtu obří soubor, když ho cat vyleje celý na obrazovku?

Použij less — stránkovač, který soubor otevře a necháš se v něm rolovat, aniž by ti přetekl terminál: šipkami se posouváš, /text hledá, g skočí na začátek, G na konec a q tě vrátí zpět (to je to jedno písmeno, co musíš znát, ať se „nezasekneš"). Když tě zajímá jen kraj souboru, sáhni po head (prvních 10 řádků) nebo tail (posledních 10). A na živé sledování logu je tail -f soubor — nechá soubor otevřený a dopisuje nové řádky, jak přibývají; ukončíš Ctrl+C.

Proč mi cp/mv přepsalo soubor bez varování a co s tím?

Protože cp i mv jsou navržené tak, aby byly tiché — když cíl už existuje, přepíšou ho bez ptaní, aby šly použít i ve skriptech, kde by se dotaz nehodil. Stejně zákeřné je přesměrování >, které cílový soubor vynuluje ještě předtím, než příkaz cokoli vypíše. Obrana: přepínač -i (cp -i, mv -i) donutí příkaz zeptat se před přepsáním, a když chceš k souboru přidávat místo přepsání, použij >> místo >. Návyk mrknout, jestli cíl už neexistuje, tě ušetří spousty mrzení.