Como posso usar “find” em scripts de shell para pesquisar a partir do diretório atual e, o mais importante, dos subdiretórios?

-1

Meu script funciona, mas o script pesquisa apenas o diretório atual. Eu gostaria que meu script procurasse por um arquivo nos subdiretórios. Isso é o que eu tenho até agora.

#!/bin/bash
read -p "file name:" fname
if find . -name "$fname"
        then
        cat -n $fname
else
        echo "file not found, try again. But, this time focus please!"
fi
    
por ep7network 18.01.2016 / 17:02

2 respostas

-1

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

    
por Sergiy Kolodyazhnyy 18.01.2016 / 17:36
0

Por padrão, find pesquisa subdiretórios, então você está indo na direção certa.

Seu if usa o código de retorno de find para decidir se encontrou algo ou não, mas não é o que significa o código de retorno find . find retornará verdadeiro se não houver erros encontrados durante a pesquisa de arquivos.

Se você quiser verificar se find realmente encontrou arquivos, verifique se imprimiu algo para stdout:

find_stdout='find . -name "$fname"'
if [ "$find_stdout" != "" ]; then
    # Found file(s) case
else
    # Found nothing case
fi
    
por caffeine.storm 18.01.2016 / 17:15