Eu faria:
#! /bin/sh -
pattern=${1?Please provide a file name}
shift
[ "$#" -gt 0 ] || set /
find "$@" -iname "$pattern" | grep '^' && exit
echo >&2 "Not found"
exit 1
Ou seja, passe o nome (observe que find o trata como um padrão (insensitivo a maiúsculas por causa de -iname ) para corresponder aos nomes dos arquivos, não como um nome de arquivo exato a ser encontrado ) como o primeiro argumento. Qualquer outro argumento são diretórios ou arquivos para pesquisar e, se nenhum for fornecido, procure em / .
Em vez de armazenar a saída em uma variável e exibi-la no final, use grep como uma passagem e isso informará se um arquivo foi encontrado.
Além disso, estou exibindo a mensagem "Não encontrado" em stderr em vez de stdout e relatando a falha para localizar o arquivo no status de saída.
Como observado por @ Thomas, há o problema comum que você não pode passar nomes de arquivos / diretórios de forma confiável para find . Se você quiser pesquisar em um diretório chamado -delete , chamar that-script name -delete , por exemplo, teria efeitos desastrosos. Com BSDs find , isso pode ser contornado fazendo (antes de chamar find ):
for i do
set -- "$@" -f "$i"
shift
done
Portável (embora note que -iname não é portátil), é necessário preceder ./ a caminhos relativos que podem ser problemáticos, como com:
for i do
case $i in
(. | ./* | /*) ;; # /foo, ./foo are not a problem
(*) i=./$i
esac
set -- "$@" "$i"
shift
done
find "$@"...
Isso afeta a saída (como em você verá ./delete/name em vez de -delete/name ).