Как может я использовать “найти” в сценариях оболочки для поиска из текущего каталога и самое главное подкаталогов?

Мой сценарий действительно работает, но сценарий только ищет свой текущий каталог. Я хотел бы, чтобы мой сценарий искал файл в подкаталогах. Это - то, что я имею до сих пор.

#!/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
-1
задан 18 January 2016 в 19:05

2 ответа

Ваш сценарий может быть упрощен. find сама команда имеет -exec флаг, который позволяет выполнять команды для работы на найденные файлы.

Кроме того, если Вы хотите найти определенный файл, Вам не нужен сценарий. Вот пример:

$ cat testdir/file2.txt                                                        
HelloAskubuntu
$ find  -name "file2.txt" -exec cat {} \; 2> /dev/null                         
HelloAskubuntu

Как Вы видите, это находит определенный файл file2.txt в подкаталоге моего текущего рабочего каталога, и cats это.

Если Вы хотите найти ряд файлов с чем-то в имени файла, Вы могли бы или использовать -regex флаг или просто подстановочный знак.

$ find  -name "file*.txt" -printf "%P:\n"  -exec cat {} \; 2> /dev/null        
file1.txt:
HelloAskubuntu
testdir/file2.txt:
HelloAskubuntu

Отметьте использование -printf отметьте, чтобы распечатать путь к файлу, найденному сначала и затем соединить его.

Обратитесь к findстраница руководства для большего количества информации об он - флаги и опции

Кроме того, в и себя, Ваш сценарий является неправильным: Вы в основном делаете тест if command find successfully exits, catinate "$fname" . Вы не говорите find чтобы сделать что-либо о найденных файлах и Вы не передаете его вывод дальнейшим командам для работы на.

Если бы Вы настаиваете на том, чтобы использовать read+find, я все еще советовал бы Вам использовать -exec флаг, или по крайней мере передают вывод на некоторое время цикл

$ 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
$ 

Вот иначе:

$ ./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
$ 

Метод выше является более общим способом иметь дело с именами файлов, нацеленными особенно для предотвращения проблем с файлами, которые содержат специальные символы на их имя Однако 90% того, что Вы делаете здесь, -exec отметьте подход, который я показал, достаточно

-1
ответ дан 29 September 2019 в 14:00

По умолчанию, find действительно ищет подкаталоги, таким образом, Вы идете в нужном направлении.

Ваш if использование код возврата от find, чтобы решить, нашло ли это что-нибудь или не, но это не то, что find означает код возврата. find возвращает true, если не было никаких ошибок, с которыми встречаются при поиске файлов.

, Если Вы хотите проверить, ли find на самом деле найденные файлы, проверьте, что это распечатало что-то к stdout:

find_stdout=`find . -name "$fname"`
if [ "$find_stdout" != "" ]; then
    # Found file(s) case
else
    # Found nothing case
fi
0
ответ дан 29 September 2019 в 14:00

Другие вопросы по тегам:

Похожие вопросы: