Linux: soubory - přesměrování



1. cat

Příkaz cat (concatenate) je velmi užitečný a má několik způsobů použití.

Spuštěný bez argumentu opisuje text ze standardního vstupu (stdin, klávesnice) na standardní výstup (stdout, terminál). Pro ukončení stiskněte zkratku Ctrl+D.

$ cat

Standardní výstup jde přesměrovat do souboru. Spusťte příkaz níže, napište několik řádků textu a ukončete. Text se zapsal do souboru dopis.

$ cat > dopis

Nyní si obsah souboru vypíšeme, opět příkazem cat:

$ cat dopis

Teď je standardním vstupem (stdin) soubor dopis, výstupem terminál (stdout).

Stejným postupem (přesměrováním do souboru) si vytvořte ještě dva soubory dopis_2 a dopis_3.

Nyní do všech tří souborů přidejte na konec jeden nebo dva dva řádky textu (pomocí dvou šipek):

$ cat >> <file>

Pro kontrolu si obsah souborů vypište.

Klávesa TAB (tabulátor)

Místo celého názvu souboru napište jen jeden-dva znaky a stiskněte klávesu TAB. Zbytek názvu se dopíše. Tím máte jistotu, že je název zapsaný správně. A taky je to pohodlnější.

Pokud je možností víc, nic se nevypíše. Stiskněte TAB ještě jednou, vypíše se seznam souborů odpovídající zapsanému vzoru.

2. Přesměrování

Znaky > a >> se přesměruje standardní výstup do souboru.
Pokud soubor neexistuje, vytvoří se.

Nejsou to všechny varianty přesměrování. Později si ukážeme další.

3. Datové proudy

V unixových systémech je zavedena dohoda, podle které je nově spuštěný program standardně vybaven třemi otevřenými datovými proudy (deskriptory):

Označení Význam Proud Default
stdin standardní vstup 0 klávesnice
stdout standardní výstup 1 terminál
stderr standardní chybový výstup 2 terminál

Pokud program potřebuje získat data, čte je z proudu 0. Potřebuje-li něco vypsat, použije proud 1, avšak pro výpis chybových hlášení se používá proud 2. Tím jde oddělit výstup od chyb.

4. man

Příkaz cat lze spustit i s parametry (přepínači). Obecný tvar je:

cat [OPTION] [FILE]

Vypište si některý z dříve vytvořených souborů takto:

$ cat -n dopis

Je vidět, že parametr -n zobrazí čísla řádků.

Jak je zjistím např. u příkazu cat?

$ cat --help
$ man cat

💡 Zapište do vyhledávače text "man cat". Výsledkem bude několik odkazů na online manuálové stránky příkazu: https://duckduckgo.com/?q=man+cat. Všechny jsou na www.man7.org

5. ls

Velmi často používaným příkazem je ls. Vypíše obsah adresáře. Adresář (directory) je v Unixových systémech běžné označení pro složku (folder). Výstupem je seznam adresářů a souborů (na TuXovi hezky barevný).

$ ls
$ ls -l

S přepínačem -l ji vypíše s podrobnostmi (typ, oprávnění, majitel, velikost, datum úpravy, název).

I příkaz ls má svůj --help a také manuálovou stránku. Nelekněte se, přepínačů je velmi velké množství (snad nejvíc ze všech příkazů). Běžně nám jich stačí pouze několik. Všimněte si, že většinou existují dvě varianty přepínačů: -krátký nebo --dlouhý.

Příkaz ls umí vypsat nejen aktuální adresář, ale i jakýkoliv jiný. Vypište si (bez a s přepínačem -l):

$ ls /home
$ ls /
$ ls -l /home
$ ls -l /

Jde vypsat i jeden soubor (ne jeho obsah, ale informace o něm):

$ ls -l dopis

Užitečný je i "žolíkový" znak *. Zastupuje libovolný počet znaků:

$ ls -l dop*

Do souboru jde přesměrovat jakýkoliv výstup, který se zobrazí na standardním výstupu – tedy např. i výstup příkazu ls nebo jiných.

$ ls > vypis_home
$ ls /
$ ls /home > vypis_all_home

Úkoly:

  1. Sestavte příkaz, který do souboru vypis_trida přesměruje (zapíše) názvy adresářů vaší třídy (těch z adresáře /home).
  2. Proveďte totéž do souboru vypis_trida_desc s tím rozdílem, že názvy budou v opačném pořadí (to zajistí vhodný přepínač příkazu ls).

6. Zástupné znaky

Zástupné znaky zpracovává bash. Programu jsou předány již expandované parametry.
Tím je dosaženo jednotného zpracování parametrů pro spouštěné příkazy. Je tedy jedno, kterému příkazu je "podsunete".

*                 Jakékoliv znaky (i žádný znak)
?                 Jakýkoliv právě jeden znak
[abc]             Jeden z uvedených znaků (zde a, b nebo c)
[a-e]             Jeden znak z rozsahu (zde a až e)
[^abc]            Cokoliv kromě a, b nebo c (lze využít i rozsah)
{slovo1,slovo2}   Jedno z uvedených slov

Příklady:

Vypíše vše, co v...

$ ls /bin/*sh        # /bin končí na sh
$ ls /bin/[bcd]*     # /bin začíná na b, c nebo d
$ ls /bin/[a-d]*     # /bin začíná na a, b, c nebo d
$ ls /bin/[a-zA-Z]   # /bin začíná na písmeno
$ ls /etc/[ab]*      # /etc začíná na a nebo b
$ ls /bin/[^abc]*    # /bin nezačíná na a, b nebo c
$ ls *{.txt,.sh}     # . končí na .txt nebo .sh
$ ls /{bin,etc}/c*   # /bin a /etc začíná na c
$ ls /{,s}bin/c*     # /bin a /sbin začíná na c
$ ls {,/usr}/bin/z*  # /bin a /usr/bin začíná na z

7. mkdir

Příkaz mkdir (make directories) vytvoří adresář(e). Vytvořte si následující adresáře takto:

$ mkdir logy
$ mkdir vykazy1 vykazy2
$ mkdir -p sestavy/leden

První příkaz vytvoří adresář logy. Druhý vytvoří dva adresáře vykazy1 a vykazy2 najednou. Třetí vytvoří adresář sestavy a v něm podadresář leden. K vytvoření adresáře včetně podadresáře slouží přepínač -p (parents) – ověřte si to pomocí mkdir --help.

Vypište si současný stav adresáře. Adresář leden ve výpisu nebude – je zanořený. Vypíšete jej takto:

$ ls sestavy

8. cd

Pro přesun mezi adresáři slouží příkaz cd (change directory). Používá se třemi způsoby
Nemá přepínače ani manuálovou stránku (příkaz je součástí jádra systému):

$ cd adresar
$ cd ..
$ cd
  1. přesun do zadaného adresáře (využíváte klávesu TAB?).
  2. přesun do "nadřazeného adresáře". To jsou ty .. (dvě tečky).
  3. návrat do domovského adresáře.

Zkuste ještě příkaz:

$ cd .

Nestane se nic. Jedna tečka totiž označuje "tento adresář".

9. cp

Příkaz cp (copy) kopíruje soubor. Základní syntaxe je:

$ cp <zdroj> <cil>

Pokud je v parametru <cil> pouze název adresáře, zachová původní název. Pokud jej uvedete, vznikne kopie s tímto názvem.

Příklady:

$ cp /etc/fstab tab    # pod názvem tab
$ cp tab tab_kopie     # kopie souboru
$ cp /etc/fstab .      # pod steným názvem

Lze využít i zástupné znaky:

$ cp adr1/* adr2       # vše z adr1 do adr2
$ cp adr1/*.txt adr2   # všechny .txt z adr1 do adr2
$ cp -r adr1/* adr2    # včetně podadresářů
$ cp -u adr1/* adr2    # pouze nové soubory

10. mv

Příkaz mv (move) plní dvě funkce: přesun nebo přejmenování. Základní syntaxe:

$ mv <zdroj> <cil>

Způsob použití je stejný jako u příkazu cp. I zde platí, že pokud neuvedete v parametru <cil> název souboru, zachová při přesunu původní název (přesune jej). Pokud název uvedete, vznikne při přesunu jej přejmenuje.

Pokud toto provedete v rámci stejného adresáře dojde k "přesunu" s přejmenováním.

Příklady:

$ mv adr1/* adr2       # přesune vše z adr1 do adr2
$ mv adr1/*.txt adr2   # přesune všechny .txt z adr1 do adr2
$ mv nazev1 nazev2     # přejmenuje nazev nazev1 na nazev2
$ mv adr1/nazev1 adr2  # přesune nazev1 pod stejným názvem
$ mv adr1/n1 adr2/n2   # přesune n1 pod novým názvem n2

Přesuny můžete provádět pouze v rámci svého /home/jmeno.

11. rm, rmdir

Příkaz rm (remove) odstraní (smaže) soubor(y). Terminál nemá "koš".
⚠️ Odstranění je nevratná operace!!! ⚠️

$ rm file                # jeden soubor
$ rm file1 file2 file3   # více souborů naráz
$ rm -i file             # potvrzení (y nebo n)

Také rm podporuje žolíkové znaky:

$ rm adresar/*           # všechny soubory v adresáři
$ rm adresar/*.txt       # všechny .txt soubory v adresáři
$ rm -i adresar/*.txt    # ...s potvrzením každého z nich

Samotný adresář se neodstraní. Ten se odstraní příkazem

$ rmdir adresar

Příkaz rmdir umí odstranit pouze prázdný adresář.

12. pwd

Příkaz pwd (print working directory) vypíše aktuální adresář:

MacBook:data machac$ pwd
/Users/machac/data

machac@TuX:~/vykazy$ pwd
/home/machac/vykazy

[jan@fedora ~/c]$ pwd
/home/jan/c

Znak ~ (vlnka, tilda) reprezentuje domovský adresář:

18CPrijmeniJ@TuX:~$ pwd
/home/18CPrijmeniJ

Výhodou tohoto zápisu je úspornost a také fakt, že pro každého uživatele je vlnka jeho home adresář.

13. Cesty

⚠️ Oblast, kde se často chybuje, resp. obtížněji se chápe.

Všechny Unixové systémy mají jedno společné: nepoužívají písmena jednotek jako Windows. Vše adresáře a soubory jsou řazené do tzv. stromové struktury a "vyrůstají" z jediného kořenového adresáře "root". Ten se značí lomítkem /.

Běžně se používají dva typy zápisu: absolutní nebo relativní.

Absolutní zápis obsahuje kompletní cestu počínaje kořenovým adresářem "root" (to první lomítko v cestě):

debian@jmeno:~$ cat /etc/network/interfaces

Relativní zápis cesty začíná názvem souboru nebo adresáře a vztahuje se k aktuálnímu pracovnímu adresáři. Pokud jsem v adresáři /etc, pak relativní cesta by byla:

debian@jmeno:/etc$ network/interfaces

14. touch

touch file1 [file2 file3 file4 file5...]

Vytvoří jeden nebo více souborů (názvy oddělujte mezerou) nulové velikosti.

$ touch aaa
$ touch bbb ccc

14.1. touch a řady {n..m}

$ touch ddd{1..5}

Konstrukce {1..5} vygeneruje řadu čísel od 1 do 5 (umí i abecedu). Vytvoří tedy pět souborů ddd1, ddd2 ... ddd5.

Funguje to tak, že shell expanduje řadu {1..5} a příkazu touch "podstrčí" už hotové názvy:

$ touch ddd1 ddd2 ddd3 ddd4 ddd5

Použití je tedy nezávislé na příkazu. Funguje i abeceda [a-z] a [A-Z]. Zkuste:

$ mkdir {A..D}_adr
$ mkdir {2023..2025}_Q{1..4}
$ mkdir {a..h}_adresar
$ mkdir adresar{X..Z}
$ touch rok_{2020..2025}.txt

15. Skryté soubory/adresáře

Ve všech Unixových systémech jsou od nepaměti skryté soubory/adresáře takové, jejichž název začíná tečkou. Tečka je znak, je tedy součástí názvu.

Nejčastěji je využívají příkazy a aplikace pro uložení svých nastavení (konfigurace). Jsou skryté z dobrého důvodu. Neodstraňujte je!

Výpis skrytých souborů/adresářů zajistí přepínač -a.

$ ls -a
$ ls --all
$ ls -l -a
$ ls -al

💡 Krátké přepínače (-) lze sdružovat za jednu pomlčku bez ohledu na pořadí. Dlouhé (--) musí být samostatně.

16. Význam znaků . a ..

Ve výpisu včetně skrytých souborů ls -a jsou na prvních dvou místech speciální soubory.

. označuje "tento adresář"

.. označuje "nadřazený adresář"

Běžně se využívají u příkazů:

$ cd ..
$ ls ..
$ ./skript.sh
$ ./nasobilka

17. ❓ Kontrolní otázky

  1. Co dělá příkaz ls a jaké přepínače můžete použít pro zobrazení skrytých souborů/adresářů?
  2. Jak vytvoříte nový adresář pomocí příkazu mkdir?
  3. Jaký je rozdíl mezi absolutní a relativní cestou k adresáři?
  4. Jaký příkaz se používá k přesměrování výstupu z příkazu do souboru?
  5. Jakým způsobem se můžete přesunout do nadřazeného adresáře pomocí příkazu cd?
  6. Jaký příkaz slouží k vytvoření prázdného souboru?
  7. Co dělá příkaz cp a jaké přepínače můžete použít pro kopírování adresářů?
  8. Jaký příkaz se používá k přesunutí souboru nebo adresáře?
  9. Jaký je rozdíl mezi příkazy rm a rmdir?
  10. Jaký je význam znaků . a .. ve správě souborů a adresářů?

18. ✏️ Cvičení

18.1. Cv_1

Pište jen číslované odpovědi na otázky:

  1. Jak si zobrazíte nápovědu příkazu xxd:
  2. Vypište adresář data, který se nachází v adresáři sady:
  3. Přesuňte se do podadresáře skripty:
  4. Přesuňte se do nadřazeného adresáře:
  5. Přesuňte se do domovského adresáře:
  6. Vytvořte nový adresář skripty v pracovním adresáři:

18.2. Cv_2

Pište jen číslované odpovědi na otázky:

  1. Vypište obsah pracovního adresáře včetně skrytých souborů:
  2. Vypište obsah adresáře etc (je v kořenovém adresáři):
  3. Vytvořte kopii souboru vypis10 s novým názvem vypis20:
  4. Přejmenujte soubor file1 na file1.txt:
  5. Jak vypadá relativní cesta k souboru nebo adresáři?
  6. Popište využití klávesy Tabulátor.

18.3. Cv_3

Pište jen číslované odpovědi na otázky:

  1. V domovském adresáři vytvořte adresář cv3.
  2. Přesuňte se do něj.
  3. Vytvořte v něm soubor skript.sh.
  4. Vytvořte jeho kopii s názvem skript2.sh.
  5. Přejmenujte ho na skript3.sh.
  6. V adresáři cv3 vytvořte adresář vystupy a v něm soubor config.
  7. Přesměrujte do něj výpis adresáře /etc.