Zdravím, mám úkol vytvořit jednoduchý příkaz na nastavení práva pro spuštění, kdy uživatel žádá cestu k adresáři, ve kterém se vyhledají všechny soubory, které obsahují v prvním řádku hlavičku: pokud nalezený soubor nemá nastavené právo ke spuštění, tak se toto právo nastaví. Součástí řešení je také kontrola platnosti cest a zobrazení textové informace o průběhu činnosti.
Můžete mi, prosím pomoci? Děkuji moc za Váš čas.
B.
Má to bejt shellovej příkaz, kterej zase bude hledat shellový (nebo libovolný se shebangem a cestou k interpretru na prvním řádku) skripty (na příponě nezáleže)?
Má to umět zpětnou kontrolu?
Má pracovat rekurzivně (hledat v podsložkách)? Pokud jo, do jaký hloubky?
Má se získat cesta z parametru, proměnný, nebo na žádost programu?
Má se výstup třídit ("Má oprávnění" / "Získal oprávnění" - v případě zpětný kontroly dále "Nelze změnit oprávnění")?
Může se použít pro lepší čitelnost ANSI formátování (tučně, podtrženě, s polovičním jasem, kurzívou, blikavě, inverzně, barvy, a to včetně kombinací)?
Tak jako tak, jednoduchej příkaz to nebude. Buďto to bude skriptík, nebo příkaz dlouhej jak pracovní tejden (ten samej skriptík, ale na jednom řádku).
Ať je to jak chce, takovou bashovinu umím zhotovit. Ale dodej další informace, ať se s nevyhovujícím výsledkem zbytečně hodinu nepatlám.
Má to bejt shellovej příkaz, kterej zase bude hledat shellový (nebo libovolný se shebangem a cestou k interpretru na prvním řádku) skripty (na příponě nezáleže)?
Jen shell co zas bude hledat jen shell.
Má to umět zpětnou kontrolu?
kontrolujte, zda změna práv neselže
pouze v zadaném adresáři
Má se získat cesta z parametru, proměnný, nebo na žádost programu?
pokud je jako parametr, tak se neptá a použije
pokud není parametr, tak se zeptá
Má se výstup třídit ("Má oprávnění" / "Získal oprávnění" - v případě zpětný kontroly dále "Nelze změnit oprávnění")?
Třídit se nemá.
Může se použít pro lepší čitelnost ANSI formátování (tučně, podtrženě, s polovičním jasem, kurzívou, blikavě, inverzně, barvy, a to včetně kombinací)?
Jde o to, udělat to co nejprimitivněji.
Předem děkuji moc za ochotu.
Pro upřesnění:
má být vytvořený skript, tedy sekvence příkazů ve spustitelném souboru
Večer na to kouknu.
Může bejt?
#!/bin/bash
## Nebudeme používat mezery v názvech souborů jako oddělovače, ale jen \n
IFS=$'\n'
## Pokud nebyla zadána cesta co by parametr, zeptej se
if [ "$1" == "" ]
then
echo -ne "\e[1mZadej cestu prohledávané složky:\e[0m "
read slozka
else
slozka=$1
fi
## Dotěrná smyčka žádající správnou cestu do složky
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
echo -e "
\e[1;4mProbíhá kontrola souborů skriptů ve složce '$slozka':\e[0m"
## Vyhledá bez rekurze (-maxdepth 1) všechny soubory (-type f) ve složce s
## nenulovou velikostí (-size +0c)...
for soubor in $(find $slozka -maxdepth 1 -type f -size +0c)
do
## ... a jestliže má v hlavičce #!/ (a nějaký malý písmeno; interpretr může
## bejt i mimo /bin, třeba v /usr/bin, /sbin, /opt a tak; berou se první
## 4 bajty),...
if head -c4 "$soubor" | grep -m1 -q "^\#\!\/[a-z]"
## ... pak, pokud je spustitelnej,...
then if [ -x "$soubor" ]
then
## ... prostě jen napíše OK a název souboru,...
echo -e " \e[1mOK\e[0m\t$soubor"
## ... jinak...
else
## se pokusí bez keců (2> /dev/null) přidat souboru
##spustitelnost, přičemž...
chmod +x "$soubor" 2> /dev/null
## ... pokud už spustitelnej je,...
if [ -x "$soubor" ]
## ... pak vypíše +x a název souboru,...
then
echo -e " \e[1;94m+x\e[0;94m\t$soubor\e[00m"
## ... nicméně, pokud to změnit nepůjde (třeba jinej vlastník),
##pak napíše KO a název souboru
else
echo -e " \e[1;91mKO\e[0;91m\t$soubor\e[00m"
fi
fi
fi
## Cyklus 'for' udělá tolik koleček, kolik je nalezenejch (všech) souboru v
## zadaným umístění
done
## No a nakonec něco jako legenda
echo -e "
\e[1mOK\e[0m = Soubor již spustitelný byl
\e[1;94m+x\e[00m = Soubor úspěšně učiněn spustitelným
\e[0;91mKO\e[00m = Oprávnění nebylo možné změnit
"
P. S.: To \e[<blablabla>m je ono barvičkování. Je tam jen pro přehlednost, nemusí tam bejt. V tom případě lze za echo vypustit -e
Děkuji mnohokrát.