Вот способ, который должен работать на всех Unix-подобных системах, без требования к конкретной оболочке или нестандартной утилите¹.
case $DIR in
-*) DIR=./$DIR;;
esac
find "$DIR" …
Если у вас есть список каталогов в ваших позиционных параметрах и вы хотите их обработать, это немного усложняется. Вот решение POSIX sh:
i=1
while [ $i -le $# ]; do
case $1 in
-*) x=./$1;;
*) x=$1;;
esac
set -- "$@" "$x"
shift
i=$(($i + 1))
done
find "$@" …
Оболочкам Борна и другим реализациям до POSIX sh не хватает арифметики и set --
, так что это немного уродливее.
i=1
while [ $i -le $# ]; do
x=$1
case $1 in
-*) x=./$1;;
esac
set a "$@" "$x"
shift
shift
i=`expr $i + 1`
done
find "$@" …
¹
readlink -f
доступно в GNU (Linux, Cygwin и т. Д.), NetBSD ≥4.0, OpenBSD ≥2.2, BusyBox. Он недоступен (если только вы не установили инструменты GNU и не убедились, что они включены в PATH
) в Mac OS X (по состоянию на 10.6.4), HP-UX (по состоянию на 11.22), Solaris (по состоянию на OpenSolaris 200906), AIX (по состоянию на 7.1).