Nauč se Python > Kurzy > Linuxová administrace > Bash II > Nela a medúzy: Kontrola souborů

Nela a medúzy: Kontrola souborů

Zapni terminál a přepni se do adresáře data-shell/north-pacific-gyre/2012-07-03.

Pomocí ls se podívej, co v adresáři je:

$ ls
goodiff         NENE01736A.txt  NENE01843A.txt  NENE01978B.txt  NENE02040Z.txt
goostats        NENE01751A.txt  NENE01843B.txt  NENE02018B.txt  NENE02043A.txt
NENE01729A.txt  NENE01751B.txt  NENE01971Z.txt  NENE02040A.txt  NENE02043B.txt
NENE01729B.txt  NENE01812A.txt  NENE01978A.txt  NENE02040B.txt

Úkol: Kolik mají řádků datové soubory s .txt na konci?

Řešení

Všechny by měly mít 300 řádků. Když se ale podíváš na výstup, zjistíš, že tomu tak není. Představ si, že máš těchto souborů k ověření několik tisíc a procházení očima nebude možné. Jak zjistíš, jestli všechny tyto soubory mají opravdu 300 řádků?

Řešení

Soubory končí většinou na písmenko A nebo B, ale je zde jeden končící Z. Spočítej, kolik je souborů končících Z.

Řešení

Už podle názvů tyhle soubory nevypadají na to, že by je někdo vytvořil ručně. Můžeš bezpečně předpokládat, že jsou výstupem nějakého programu na zpracování vzorků.

Podívej se do několika z nich (např. pomocí příkazu less), abys zjistila jak zhruba vypadají informace v nich obsažené.

Obsahem je relativní výskyt 300 bílkovin v různých hloubkách oceánu. A a B jsou dvě hloubky, na nichž bylo prováděno měření; Z znamená, že se hloubku z nějakého důvodu nepodařilo zjistit. Kratší soubor je způsobený restarem počítače během měření. Nevíme, zda takový soubor bude použitelný pro další zpracování.

Hranaté závorky: Filtrování písmen

Už znáš hvězdičku a otazník, díky nimž můžeš vytvořit masky souborů. Existují i další „finty“, jak jména souborů filtrovat. Jednu z nich si teď ukážeme. Když dáš do hranatých závorek výčet znaků, které chceš hledat, např. [AB], celý výraz v závorkách se nahradí za jedno písmenko – buďto A nebo B. Můžeš tak odfiltrovat soubory, které končí na Z:

$ ls *[AB].txt
NENE01729A.txt  NENE01751A.txt  NENE01843A.txt  NENE01978B.txt  NENE02040B.txt
NENE01729B.txt  NENE01751B.txt  NENE01843B.txt  NENE02018B.txt  NENE02043A.txt
NENE01736A.txt  NENE01812A.txt  NENE01978A.txt  NENE02040A.txt  NENE02043B.txt

V tomto případě dostaneš stejný výstup, když napíšeš příkaz:

$ ls *A.txt *B.txt

Výstup se ale bude lišit v případě, kdy neexistuje soubor kterému taková maska odpovídá. Představ si, že chceš vypsat všechny soubory, které mají na konci A, B nebo C:

$ ls *[ABC].txt
NENE01729A.txt  NENE01751A.txt  NENE01843A.txt  NENE01978B.txt  NENE02040B.txt
NENE01729B.txt  NENE01751B.txt  NENE01843B.txt  NENE02018B.txt  NENE02043A.txt
NENE01736A.txt  NENE01812A.txt  NENE01978A.txt  NENE02040A.txt  NENE02043B.txt

$ ls *A.txt *B.txt *C.txt
ls: cannot access '*C.txt': No such file or directory
 NENE01729A.txt   NENE01751B.txt   NENE01978A.txt   NENE02040B.txt
 NENE01729B.txt   NENE01812A.txt   NENE01978B.txt   NENE02043A.txt
 NENE01736A.txt   NENE01843A.txt   NENE02018B.txt   NENE02043B.txt
 NENE01751A.txt   NENE01843B.txt   NENE02040A.txt

Bash nechá *C.txt beze změny, protože takový soubor nenajde. Program ls si pak postěžuje že soubor *C.txt nezná.

Zkus si, co v těchto případech dostává příkaz ls od Bashe. To můžeš zjistit tak, že místo ls zadáš echo:

$ echo *[ABC].txt
$ echo *A.txt *B.txt *C.txt

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.