Příkazový řádek - skript

Založil simir20, 19. 11. 2017, 09:28:51

Předchozí téma - Další téma

simir20

Ahojte,
Potřeboval bych pomoct s úkolem prosím. Zadání zní vytvořit skript:
"Zálohování (tar + gz) skrytých souborů. Uživatel zadá cestu do adresáře ve kterém se vyhledávají všechny skryté soubory (a adresáře) a zazálohují se na uživatelem definované umístění. Součástí řešení bude kontrola platnosti cest a zobrazení textové informace o průběhu činnosti."

Našel jsem že k zálohování by se mohl užít příkaz tar -czf nazev.tar.gz /cesta k souboru/* ale nevím jak to všechno nabouchat do toho skriptu aby to splňovalo zadání. Děkuju za pomoc

Roman Horník

#1
Velmi stručně - find <složka> -type f,d -maxdepth 1 -name ".*" znáš? Vyhledá ve složce bez rekurze (nebude hledat do hloubky, uvidí jen to, co je v definovaný složce) skrytý (začínaj tečkou) soubory (-type f) a složky (-type d). Takový soubory a složky můžeš následně přidávat do archívu. To celý můžeš zabalit do cyklu for. Kontrola, protože se vyhledanej soubor (složka je ve skutečnosti taky soubor) ihned přidá do archívu, nebude nutná, leda by měl ultrajepičí život.
Jak zadat cestu? Inspiruj se tady. Jak postupně přidávat soubory do archívu? Zde.
Tvou práci můžu zkontrolovat, samozřejmě bez známkování.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

simir20

#2
Děkuji, zkoušel sem to nějak splácat, ale bohužel moc tomu nerozumím. Mohlo by to být nějak takhle?

#!/usr/local/bin/bash
if  [ "$1" == "" ]
then
echo -ne ,,Zadej cestu slozky"
read slozka
else
slozka=$1
fi

find <slozka> -type f,d -maxdepth 1 -name ".*"

tar -czf archiv.tar.gz /cesta_k_souborum/*


Roman Horník

#3
Hmmmmm... ne.
Nejdřív zjišťuješ, jestli byl zadanej parametr ($1). Pokud je prázdnej (""), tedy nebyl zadanej, pak se to zeptá a proměnná $slozka se naplní tím, co po výzvě zadáš, pokud jo, pak se nadefinuje proměnná $slozka z toho, co zadáš za příkaz. Jenže tady chybí zpětná kontrola, jestli to, cos zadal, není kokotina, jestli je to existující složka. Prostě za tím musí následovat:
while :
  do if [ -d "$slozka" ]
    then
      break
    else
      echo -ne "\n\e[1m'$slozka' NENÍ platná složka\nZadejte PLATNOU cestu prohledávané složky:\e[0m "
      read slozka
  fi
done


Je to de facto nekonečná smyčka, kterou přerušíš tím, že zadáš platnou cestu.

Dále, co je blbě na  echo -ne ,,Zadej cestu slozky"? Uvozovky. Nepoužívaj se český, ale anglický, tyhle: " "

Cyklus for máš kde? Nic těžkýho na tom není:

for soubor in $(find $slozka -type f,d -maxdepth 1 -name ".*")
  do <něco, co bude pracovat s proměnnou $soubor>
done


Tady to znamená, že for spustí příkaz v $(příkaz) (lze použít i `příkaz`; obrácenej apostrof), kterej má ňákej výstup, tady sekvenci názvů souborů. Ty názvy jsou ve výstupu oddělený ňákým bílým znakem, mezerou, tabulátorem, nebo novým řádkem - definuje globální proměnná $IFS (interní oddělovač polí) - k tomu dále.
Takhle získáš do proměnný $soubor sekvenci názvů souborů, se kterou pak můžeš pracovat v regionu mezi do a done; co otočka v cyklu, to další název souboru v proměnný, dokud se nezpracuje poslední soubor v sekvenci, pak se cyklus ukončí a pokračuje další část skriptu za ním.

Příklad:
for cislo in 0 1 2 3 4 5 6 7 8 9 A B C D E F
  do echo "$cislo"
done

neboli:

for cislo in {0..9} {A..F}
  do echo "$cislo"
done


Protože echu postupně sypeš čísla a písmena v pořadí, v jakým jsi je zadal, vypíšou se pod sebe čísla 0-9 a písmena A-F (tady nelze bohužel míchat čísla a písmena, proto jsou zvlášť).
Do toho cyklu použiješ to, na co jsem Ti dal odkaz, jak přidávat soubory do archívu.
No a ještě k tomu IFS - protože názvy souborů můžou obsahovat mezery, je dobrý IFS předefinovat, protože jinak soubor "Můj skript.sh" se bude považovat za dva (neexistující), za "Můj" a "skript.sh", protože mezera mezi nima je považovaná jako separátor. Takže hned pod hlavičku si přidej:
IFS="\n"
... a jako separátor se bude považovat jen novej řádek. Tabulátor je mimochodem \t

Důrazně Ti doporučuju mít imrvére spuštěnej terminál a zkoušet si to v něm, prostě si s ním hrát, protože to zjevně neděláš a díky tomu vůbec nevíš, která bije. Taky si pročti tohle. Je to hodně šikovnej návod pro skriptování v BASHi, začátečnický i dost pokročilý, kde je mrtě funkčních příkladů. Je to sice anglicky, ale u programování je znalost angličtiny potřeba, protože ty příkazy jsou zpravidla anglický slova, nebo zkratky. Dá se i stáhnout.

Když se budeš snažit, když si s tím budeš hrát, tak se to naučíš. Není to kravina, kterou bys v životě neupotřebil, jako třeba učivo z občanky, kde je to poslední dobou samá eurosvazácká propaganda a óda na multikulturalismus, ekoterorismus a homofilii. Skriptování ber jako stavebnici, kde z vhodně vybranejch a poskládanejch primitivních dílků můžeš postavit něco velkýho, tak velkýho, kam až sahá Tvoje vědomí a možnosti stroje.
Debian Sid/Experimental 64bit + Mate Desktop Environment
* CPU: Intel i5 3570
* GPU: NVIDIA GTX650 1GD5
* MB: Lenovo IH61M
* RAM: 16GiB Deutsche Demokratische Republik 3 @ 1600MHz

simir20

Moc děkuju, za podrobný popis a užitečné rady a odkazy. Víceméně mi to už funguje, Uživatel zadá cestu do adresáře ve kterém se vyhledávají všechny skryté soubory (a adresáře) , potom zadá cestu cílového adresáře kde chce zálohu provést a pak pomocí příkazu: tar -czf $cilova_destinace/archiv.tar.gz $adresar_k_zaloze/*  zálohuji.
Tak to sice nějakou zálohu vytvoří, ale nevím jak to udělat tak aby to zazálohovalo ty skryté soubory.
Neví někdo jak to zapsat? Díky