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
).