Мой сценарий действительно работает, но сценарий только ищет свой текущий каталог. Я хотел бы, чтобы мой сценарий искал файл в подкаталогах. Это - то, что я имею до сих пор.
#!/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
Ваш сценарий может быть упрощен. find
сама команда имеет -exec
флаг, который позволяет выполнять команды для работы на найденные файлы.
Кроме того, если Вы хотите найти определенный файл, Вам не нужен сценарий. Вот пример:
$ cat testdir/file2.txt
HelloAskubuntu
$ find -name "file2.txt" -exec cat {} \; 2> /dev/null
HelloAskubuntu
Как Вы видите, это находит определенный файл file2.txt
в подкаталоге моего текущего рабочего каталога, и cat
s это.
Если Вы хотите найти ряд файлов с чем-то в имени файла, Вы могли бы или использовать -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
отметьте подход, который я показал, достаточно
По умолчанию, 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