Bash script

Všetko ohľadom Linuxu...
Pe7er
Amateur
Amateur
Príspevky: 25
Registrovaný: 22 jan 2009, 19:37

Bash script

Príspevok od používateľa Pe7er »

Kód: Vybrať všetko

Naprogramujte svoj príkaz find, ktorý prehľadá zadaný podstrom, nájde súbory, ktoré budú zadané a vykoná na nich uvedenú sériu príkazov. Zadanie vypracujte nasledovne: script musí obsahovať Usage, t.j. po nesprávnom zadaní parametrov výpise ich správne poradie a ukončí sa. Jednotlivé úseky programu okomentujte. Chybové stavy spracujte a vypíšte chybové hlásenie
vôbec neviem ako by sa dal nájsť nejaký súbor bez použitia find, nejaké nápady ?
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: Bash script

Príspevok od používateľa Aiden »

skus skombinovat napriklad ls -la a grep :)
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: Bash script

Príspevok od používateľa pato83 »

Pe7er napísal:

Kód: Vybrať všetko

Naprogramujte svoj príkaz find, ktorý prehľadá zadaný podstrom, nájde súbory, ktoré budú zadané a vykoná na nich uvedenú sériu príkazov. Zadanie vypracujte nasledovne: script musí obsahovať Usage, t.j. po nesprávnom zadaní parametrov výpise ich správne poradie a ukončí sa. Jednotlivé úseky programu okomentujte. Chybové stavy spracujte a vypíšte chybové hlásenie
vôbec neviem ako by sa dal nájsť nejaký súbor bez použitia find, nejaké nápady ?
Co ma byt ako ta uvedena seria prikazov? Ma to byt nieco ako ma find exec alebo len to, ze na standardny vystup pojdu len cesty k suborov podla tvojich pravidiel ?
Pe7er
Amateur
Amateur
Príspevky: 25
Registrovaný: 22 jan 2009, 19:37

Re: Bash script

Príspevok od používateľa Pe7er »

pato83 napísal:Co ma byt ako ta uvedena seria prikazov? Ma to byt nieco ako ma find exec alebo len to, ze na standardny vystup pojdu len cesty k suborov podla tvojich pravidiel ?
tak to sa mi este nepodarilo zistit, tiež tomu nerozumiem :?
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: Bash script

Príspevok od používateľa pato83 »

Pe7er napísal:
tak to sa mi este nepodarilo zistit, tiež tomu nerozumiem :?
A to ani nevies, co za seriu prikazov?
Pe7er
Amateur
Amateur
Príspevky: 25
Registrovaný: 22 jan 2009, 19:37

Re: Bash script

Príspevok od používateľa Pe7er »

bohužiaľ nie, to je celé zadanie
prdo
Medium Expert
Medium Expert
Príspevky: 92
Registrovaný: 19 okt 2010, 18:02

Re: Bash script

Príspevok od používateľa prdo »

aha... a co tak si dat do terminalu
man grep
man ls
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: Bash script

Príspevok od používateľa pato83 »

Tak tu mas find v bash. ls ani grep nebolo nutne pouzit. Snaha bola ostat co najviac v bash, aj ked mozno su este jednoduchsie postupy v urcitych pripadoch.
Je to taka chaba naplast (aj ked mne osobne by v pohode stacila vo vacsine pripadov ako nahrada s moznostami, ktore ma) co sa tyka find-u a jeho moznosti. Vystupom su len vyhovujuce subory, takze je mozne na nich napachat cokolvek, ak sa vysledok skriptu presmeruje do rury a za nou sa da ta neznama seria prikazov spomenuta v zadani.

Kód: Vybrať všetko

#! /bin/bash
###############################################################################
# 
# Description: This script is meant to be a replacement of find.
#
###############################################################################

declare -a ARRAY_FILES
declare INPATH REGEXP MTIME PERMISSION EXTENSION TYPE
declare -i INDEX=0
readonly E_DIR=1
readonly E_WRONG_ARG=2
readonly E_PERMISSION=3
readonly E_MTIME=4
readonly E_TYPE=5
readonly E_CMD=127
readonly VERSION='0.1_051110'

###############################################################################
################## Verifying functions  #######################################
###############################################################################

# Guess what this function does
# 
CheckBashVersion()
{
if [[ ${BASH_VERSINFO} -lt 4 ]]
then
	echo "Pre spravny chod skriptu je nutne mat bash vo verzii 4 a vyssie!"
fi
}


# Guess what this function does
# 
CheckPermissionFormat()
{
if [[ ${PERMISSION} =~ ^[0-7][0-7][0-7]$ ]]
then
	:
else
	echo -e "Zadal si prava v nespravnom formate.\nSkus napovedu: ${0##*\/} --help"
	exit ${E_PERMISSION}
fi
}


# Guess what this function does
# 
CheckMtimeFormat()
{
if [[ ${MTIME} =~ ^[\>,\<] ]]
then
	EXTENSION="${BASH_REMATCH[0]}"
fi

if MTIME=$(date --date "${MTIME#[<,>]}" +%s 2>/dev/null)
then
	:
else
	echo -e "Nespravne zadany format pre cas poslednej upravy suboru/adresaru.\nSkus napovedu: ${0##*\/} --help"
	exit ${E_MTIME}
fi
}


# Guess what this function does
# 
CheckTypeFormat()
{
if [[ ${TYPE} =~ ^[b,c,d,f,l]$ ]]
then
	:
else
	echo -e "Nespravne zadany format pre typ suboru.\nSkus napovedu: ${0##*\/} --help"
	exit ${E_TYPE}
fi
}

###############################################################################
################################ Main functions ###############################
###############################################################################

# Guess what this function does
#
Help()
{
cat <<_EOF
Vysvetlenie: Tento skript ma za ucel nahradit find

Moznosti:
	-d ; --directory : Urcuje adresar, kde hladat. Ak nie je nastavena, berie sa aktualny adresar. 
	-r ; --regexp : Urcuje regularny vyraz. Je mozne ucinnejsie vyselektovanie v konecnom vysledku.
			Moze sa zadat aj cely nazov subory/adresara, vtedy je vhodne zadat nasledovne:
			^nazov_suboru$ , znak ^ urcuje zaciatok riadku a znak $ koniec riadku. 
	-p ; --permission : Vyhladava sa na zaklade prav k suborom/adresarom. Je nutne zadat v osmickovej sustave
			    ako napr. 777 , kde sa vyhlada subor/adresar, ktoreho prava su nastavene nasledovne:
			    citat, zapisovat, vykonavat pre vlastnika, skupinu a vsetkych ostatnych su zarucene.
	-m ; --mtime : Vyhladava sa na zaklade casu poslednej upravy suboru ci adresara.
		       Format zapisu : YYYY-MM-DD HH:MM:SS Je nutne dat cas do jednoduchych uvodzoviek. Vid ukazky.
		       Pred cas je nutne pridat jednu z nasledujucich moznosti:
		       > zobrazi mladsie subory ako stanoveny cas
		       < zobrazi starsie subory ako stanoveny cas
		       bez znaku zobrazi subory vytvorene presne v stanoveny cas
	-t ; --type : Vyhladava na zaklade typu suboru: Moznosti su nasledovne:
		      b - blokove zariadenia
		      c - znakove zariadenia
		      d - adresar
		      f - subor
		      l - odkaz na adresar/subor (symbolic link)
	-h ; --help : Zobrazi napovedu.
	-v ; --version :  Zobrazi len verziu.

Ukazky:
	${0##*\/} -d /home/user -p 755 -r ^l.*$
	- vyhlada vsetky subory/adresare v /home/user s pravami 755 a vyhovujuce zaroven regularnemu vyrazu, 
	  budu zacinat na l

	${0##*\/} -d /home/user -m '>2010-10-10 15:00:20' -t f
	- vyhlada vsetky subory/adresare v /home/user, ktore boli modifikovane neskor, ako je stanoveny cas a
	  zaroven su subory

Ak je skript ulozeny v PATH a ma nastavene prava pre spustenie, tak sa skript moze spustat nasledovne :
	${0##*\/}
inak takto :
	bash $0

Dufam, ze skript ma prinos pre uzivatela, ale ziadne naroky za sposobenu skodu nemozu byt garantovane !!!
Skript spustate na vlastnu zodpovednost.
_EOF
}


# Guess what this function does
#
LoadParameters()
{
while [[ ${1} ]]
do
	case "${1}" in

		-d | --directory )
			INPATH="${2}"
			shift 2
		;;

		-r | --regexp )
			REGEXP="${2}"
			shift 2
		;;
		
		-m | --mtime )
			MTIME="${2}"
			CheckMtimeFormat
			shift 2
		;;

		-p | --permission )
			PERMISSION="${2}"
			CheckPermissionFormat
			shift 2
		;;

		-t | --type )
			TYPE="${2}"
			CheckTypeFormat
			shift 2
		;;

		-h | --help )
			Help
			exit 0
		;;
	
		-v | --version )
			echo ${VERSION}
			exit 0
		;;

		* )
			echo -e "Zadal si neznamy argument.\nSkus napovedu: ${0##*\/} --help"
			exit ${E_WRONG_ARG}
		;;
	esac
done
}


# Guess what this function does
#
GetListOfFiles()
{
[[ ${INPATH} ]] && INPATH="$(readlink -f "${INPATH}")" || INPATH="${PWD}" 

if [[ ! -e ${INPATH} ]] 
then
	echo -e "Nasledujuci adresar neexistuje:\n${INPATH}"
	exit ${E_DIR}
fi

if [[ ! -d ${INPATH} ]]
then
	echo -e "Zadany adresar nie je adresar:\n${INPATH}"
	exit ${E_DIR}
fi

shopt -s globstar
ARRAY_FILES=( "${INPATH}"/** )
shopt -u globstar
}


# Guess what this function does
# 
SelectFiles()
{
local FILE

for FILE in "${ARRAY_FILES[@]}"
do
	SelectFilesByRegexp "${FILE}" | \
	SelectFilesByModificationTime| \
	SelectFilesByPermission | \
	SelectFilesByType
done
}


# Guess what this function does
# 
SelectFilesByRegexp()
{
if [[ "${REGEXP}" ]]
then
	[[ "${1##*\/}" =~ ${REGEXP} ]] && echo "${FILE}"
else
	echo "${FILE}"
fi
}


# Guess what this function does
# 
SelectFilesByModificationTime()
{
read FILE
declare -i FILE_MTIME

if [[ ${FILE} ]]
then
	if [[ ${MTIME} ]]
	then
		if [[ ${EXTENSION} == '>' ]]
		then
			FILE_MTIME="$(stat -c %Y "${FILE}")"
			[[ ${FILE_MTIME} -gt ${MTIME} ]] && echo "${FILE}"
		elif [[ ${EXTENSION} == '<' ]]
		then
			FILE_MTIME="$(stat -c %Y "${FILE}")"
			[[ ${FILE_MTIME} -lt ${MTIME} ]] && echo "${FILE}"
		else
			FILE_MTIME="$(stat -c %Y "${FILE}")"
			[[ ${FILE_MTIME} -eq ${MTIME} ]] && echo "${FILE}"
		fi
	else
		echo "${FILE}"
	fi
fi
}


# Guess what this function does
# 
SelectFilesByPermission()
{
read FILE
local FILE_RERMISSION

if [[ ${FILE} ]]
then
	if [[ ${PERMISSION} ]]
	then
		FILE_RERMISSION="$(stat -c %a "${FILE}")"
		[[ ${FILE_RERMISSION} -eq ${PERMISSION} ]] && echo "${FILE}"
	else
		echo "${FILE}"
	fi
fi
}


# Guess what this function does
# 
SelectFilesByType()
{
read FILE
local FILE_TYPE

if [[ $FILE ]]
then
	if [[ $TYPE ]]
	then
		FILE_TYPE="$(stat -c %F "${FILE}")"
		FILE_TYPE="${FILE_TYPE:0:1}"
		case ${TYPE} in
	
		b )
			[[ ${FILE_TYPE} == b ]] && echo "${FILE}"
		;;
	
		c )
			[[ ${FILE_TYPE} == c ]] && echo "${FILE}"
		;;

		d )
			[[ ${FILE_TYPE} == d ]] && echo "${FILE}"
		;;
	
		f )
			# stat vracia pri subore 'regular file'
			# a teda prvy znak je r, ale zadat ako typ suboru
			# je prirodzenejsie 'f' nez 'r'
			[[ ${FILE_TYPE} == r ]] && echo "${FILE}"
		;;

		l )
			# stat vracia pri odkaze 'symbolic link'
			# a teda prvy znak je s, ale zadat ako typ suboru
			# je prirodzenejsie 'l' nez 's'
			[[ ${FILE_TYPE} == s ]] && echo "${FILE}"
		;;

		esac
	else
		echo "${FILE}"
	fi
fi
}

###############################################################################
############################### MAIN PROGRAM ##################################
###############################################################################

LoadParameters "${@}"
GetListOfFiles
SelectFiles
exit 0
Skript je funkcny, nie je nutnost ziadny ls ani grep. Je vsak nutny readlink, stat a date (vsetky sucastou coreutils, takze to zrejme overovat netreba, ci sa nachadzaju) a samotny bash vo verzii 4 a vyssej. Ako si si vsimol, komenty nie su. Je to pomerne jednoduchy skript a aj ty sa chces urcite nieco naucit. ;) Takze vid toto: http://www.gnu.org/software/bash/manual ... index.html Ked budu nejake otazky, pomozem, ale necakaj tie komenty vsetky ani zdaleka. Nehnevaj sa, ale ked tu niekto ma 17 prispevkov a vsetko domace ulohy, tak to nie je nijak prinosne pre nikoho ineho len teba. Ak nieco dostavas, musis aj davat. ;)

p.s.: Osobne, neokomentovany kod odovzdat ako riesenie by som ja na mieste ucitela hodnotil za 5 a pevne verim, ze aj tvoj ucitel je rovnakeho nazoru. :) Cely vikend mas na to.

p.s.2: Kod moze obsahovat chyby samozrejme (logicke, syntax atd), takze budem len rad, pokial na ne niekto upozorni.
Pe7er
Amateur
Amateur
Príspevky: 25
Registrovaný: 22 jan 2009, 19:37

Re: Bash script

Príspevok od používateľa Pe7er »

to som vážne nečakal, že to niekto spraví :shock: , ani som to nechcel, len nejaké nápady, ja to samozrejme nejdem odovzdávať, predsa len tomu scriptu uplne nerozumiem a sú tam veci, ktoré sme nebrali, ale veľká vďaka niečo z toho určite využijem
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: Bash script

Príspevok od používateľa pato83 »

Pe7er napísal:to som vážne nečakal, že to niekto spraví :shock: , ani som to nechcel, len nejaké nápady, ja to samozrejme nejdem odovzdávať, predsa len tomu scriptu uplne nerozumiem a sú tam veci, ktoré sme nebrali, ale veľká vďaka niečo z toho určite využijem
Mna to bavilo, takze v tom problem nevidim. Tak ten skript mozes pouzit cely a len dopisovat funkcie na dalsie moznosti pre vyhladavanie, ktory pridas do rury vo funkcii SelectFiles a ides. Ja neviem, co s tym ides robit, ale z tvojich prispevkov nic ine mi nevyplynulo, tak preto som takto reagoval. A ako som uz povedal, ak niecomu nerozumies, tak sa pytaj, co viem, odpoviem.
SAmo
Medium Expert
Medium Expert
Príspevky: 121
Registrovaný: 15 dec 2006, 9:19

Re: Bash script

Príspevok od používateľa SAmo »

to mas od Steinyho alebo co ?
pato83
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3916
Registrovaný: 21 nov 2005, 22:12

Re: Bash script

Príspevok od používateľa pato83 »

SAmo napísal:to mas od Steinyho alebo co ?
To bolu komu myslene a co tym bolo myslene ?

p.s: Akokolvek sa tu niekto ohana, aby sa necitoval predchadzajuci prispevok, ja som nazoru, ze by sa mal vzdy citovat prispevok, na ktory sa reaguje. To nie na teba SAmo, ale vzhladom na niektore reakcie na fore.
Skyer
Light Star
Light Star
Príspevky: 231
Registrovaný: 30 mar 2010, 15:41
Bydlisko: Bratislava

Re: Bash script

Príspevok od používateľa Skyer »

Pe7er: Viem, že je to off topic, ale ak sa jedná o zadanie do školy, na akú školu prosim ťa chodíš? Dik
Brian
Expert
Expert
Používateľov profilový obrázok
Príspevky: 188
Registrovaný: 04 mar 2005, 16:09
Bydlisko: New York

Re: Bash script

Príspevok od používateľa Brian »

pato83 napísal:To bolu komu myslene a co tym bolo myslene ?

p.s: Akokolvek sa tu niekto ohana, aby sa necitoval predchadzajuci prispevok, ja som nazoru, ze by sa mal vzdy citovat prispevok, na ktory sa reaguje. To nie na teba SAmo, ale vzhladom na niektore reakcie na fore.

Bola to otázka na autora topicu a bolo to myslené tak, že či je študentom FIIT STU a ma to ako ulohu na operačné systémy, ktoré učí Ing.Steinmuller... A takéto podobné zadania dáva takže je to veľmi podozrivé.. :D
Tým som myslím odpovedal aj na další post..:D
Napísať odpoveď