Portál AbcLinuxu, 1. listopadu 2025 03:51
d=$(find . -type d | wc -l) f=$(find . -type f | wc -l) echo "There are $d directories and $f files"
Účelem domácího úkolu je, aby se nad ním student sám zamyslel, ne aby se na něj anonymně ptal na ABCLinuxu. 
Zpět k tématu: Jde to dokonce i bez jakýchkoliv externích procesů (ls, find), pouze pomocí Bashe. Jediné, na co je třeba si dát pozor, je zvláštní chování find k symlinkům. Implicitně (-P) je nenásleduje (což se dá změnit pomocí -L), zatímco Bash při testování cest symlinky vždy následuje, jinými slovy, máme-li symlink na soubor, [[ -f symlink ]] i [[ -L symlink ]] uspějí.
Pokud tohle^^^ vezmeme v potaz, tady je implementace jen pomocí Bashe a ničeho jiného:
rlist() {
local -r dir="$1"
local -i files=0
local -i dirs=1
local -i links=0
local -i other=0
local -a -i rec
local item
for item in "${dir}/"{,.[^.],..?}*; do
if [[ -L "$item" ]]; then
((++links))
elif [[ -f "$item" ]]; then
((++files))
elif [[ -d "$item" ]]; then
rec=($(rlist "$item"))
files+=rec[0]
dirs+=rec[1]
links+=rec[2]
other+=rec[3]
elif [[ -e "$item" ]]; then
((++other))
fi
done
echo "$files" "$dirs" "$links" "$other"
}
count() {
local -a -i -r rec=($(rlist "$1"))
echo "There are ${rec[1]} directories" \
"and ${rec[0]} files" \
"and ${rec[2]} symlinks" \
"and ${rec[3]} other inodes."
}
Příklad: count /můj/adresář
Implementace ekvivalentu find -L by byla jednoduší; stačilo by odstranit větev a proměnnou pro symlinky.
…je uplne jedno jestli je to ukol nebo neni, tak to naopak jen odradi od dalsiho usili a snazeni..Pokud někdo není ochoten věnovat tomu aby se něco naučil trochu toho úsilí a snažení, tak bude jen dobře když skončí u OS, kde si za svou lenost zaplatí.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.