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.