#!/bin/sh find_level() { if [ "$1" = 1 ]; then pkg_info | awk '{print $1}' | while read name do grep -q '^@pkgdep' /var/db/pkg/$name/+CONTENTS || echo $name done > l1 return fi cat l* > "s$1" pkg_info | awk '{print $1}' | fgrep -xvf "s$1" | while read name do awk '/^@pkgdep/ {print $2}' /var/db/pkg/$name/+CONTENTS | grep -qxvf "s$1" || echo $name done > "l$1" } i=1 find_level $i while [ -s "l$i" ] do i=$(($i+1)) find_level $i done