Seu script pode ser simplificado. O comando find
tem -exec
flag, que permite executar comandos para operar nos arquivos encontrados.
Além disso, se você quiser encontrar um arquivo específico, não precisa de um script. Aqui está um exemplo:
$ cat testdir/file2.txt
HelloAskubuntu
$ find -name "file2.txt" -exec cat {} \; 2> /dev/null
HelloAskubuntu
Como você pode ver, ele encontra o arquivo específico file2.txt
no subdiretório do meu diretório de trabalho atual e cat
s.
Se você quiser encontrar um conjunto de arquivos com algo no nome do arquivo, poderá usar -regex
flag ou simplesmente curinga.
$ find -name "file*.txt" -printf "%P:\n" -exec cat {} \; 2> /dev/null
file1.txt:
HelloAskubuntu
testdir/file2.txt:
HelloAskubuntu
Observe o uso do -printf
flag para imprimir o caminho para o arquivo encontrado primeiro e, em seguida, catinate.
Consulte a página de manual do find
para mais informações sobre seus sinalizadores e opções
Além disso, o script está incorreto: basicamente, você está fazendo o teste if command find successfully exits, catinate "$fname"
. Você não está dizendo find
para fazer nada sobre os arquivos encontrados e você não está passando sua saída para quaisquer outros comandos para operar.
Se você insistir em usar read + find, ainda aconselho usar -exec
flag, ou pelo menos transmitir a saída para um loop while
$ cat testscript.sh
#!/bin/bash
read -p"Enter filename:" FILE
find -name "$FILE" -exec cat {} \; 2> /dev/null
$ ./testscript.sh
Enter filename:file2.txt
HelloAskubuntu
$
Aqui está outra maneira:
$ ./testscript.sh
Enter filename:file2.txt
./testdir/file2.txt
HelloAskubuntu
$ cat testscript.sh
#!/bin/bash
read -p"Enter filename:" USERINPUT
find -name "$USERINPUT" -print0 2>/dev/null | while IFS="" read -r -d "" FILE;
do
echo "$FILE"
cat "$FILE"
done
$
O método acima é uma maneira mais geral de lidar com nomes de arquivos, especialmente para evitar problemas com arquivos que contenham caracteres especiais em seu nome No entanto, para os 90% do que você está fazendo aqui, a abordagem -exec
flag que mostrei é suficiente