Как написать сценарий, запрашивающий имя файла для поиска и печати всех файлов с этим именем

groff: can't find DESC' file groff:fatal error: invalid device utf8

Это говорит о том, что ваша настройка groff неверна или у вас их несколько, и человек использует не тот.

Изменение вашей локали на "C" (без UTF -8 на данный момент, в этой оболочке )ваши справочные страницы могут снова стать видимыми. Вы хотите посмотреть grops(1 )и grotty(1 )в разделе ФАЙЛЫ. Это скажет вам, где находится файл grops/grotty DESC; он должен быть и для UTF -8.

В моей системе есть

$ ls /usr/share/groff/1.22.3/font/dev[aup]*/DESC
/usr/share/groff/1.22.3/font/devascii/DESC
/usr/share/groff/1.22.3/font/devpdf/DESC
/usr/share/groff/1.22.3/font/devps/DESC
/usr/share/groff/1.22.3/font/devutf8/DESC

Если вы не найдете devutf8/DESC, ваша установка groff не завершена (по отношению к UTF -8 ). Если вы его найдете, вам нужно будет проверить, есть ли у вас две установки groff и, если да, использует ли man(1 )правильную.

Чтобы убедиться, что ваша установка groff может отображать вашу справочную страницу без man(1 ), вы можете использовать groff напрямую,

$ nroff -t -e -mandoc openshell2017/opsh/man/opsh.1 | less 
0
08.11.2019, 07:33
2 ответа

Вы можете использовать что-то вроде:

#!/bin/bash
echo "please enter filename"
read filename

find. -name "$filename" | egrep '.*'

if [ "$?" -ne 0 ] 
then
    echo "file does not exist"
fi
2
28.01.2020, 02:39

Для простой задачи поиска всех файлов с определенным именем с помощью bashвам не нужен find. Утилита findболее полезна для случаев, когда вам действительно нужно выполнять операции с найденными файлами.

В оболочке bashесть специальный шаблон **, который «рекурсивно» сопоставляется с подкаталогами. Этот шаблон активируется установкой параметра оболочки globstar.

#!/bin/bash

shopt -s globstar dotglob nullglob

pathnames=(./**/"$1" )

if [[ ${#pathnames[@]} -gt 0 ]]; then
    printf 'Found "%s"\n' "${pathnames[@]}"
else
    printf 'Found no file named "%s"\n' "$1"
fi

Это расширит шаблон ./**/"$1", который соответствует всем именам файлов, соответствующим первому аргументу командной строки сценария в любом месте текущего каталога или ниже него. Полученные пути сохраняются в массиве pathnames. Затем выполняется проверка длины этого массива, и если он содержит что-то (, массив имеет длину больше нуля ), элементы массива выводятся на печать. Если массив пуст, выводится соответствующее сообщение.

Параметры оболочки dotglobи nullglobобеспечивают соответствие шаблонов подстановки оболочки скрытым файлам и полное удаление шаблона, если он ничему не соответствует, соответственно.

Обратите внимание, что сценарий (, как и ваш код ), не делает различий между обычными файлами, каталогами, символическими ссылками или другими типами файлов.

Тестирование этого скрипта:

$ bash ~/script.sh.zshrc
Found "./.zsh/.zshrc"
Found "./skel/.zshrc"
$ cd /etc
$ bash ~/script.sh.zshrc
Found no file named ".zshrc"

Без этого скрипта установка параметров оболочки failglobи globstarв bashпозволила бы нам эффективно делать то же самое, что и скрипт непосредственно в командной строке:

$ shopt -s globstar failglob dotglob
$ echo./**/.zsh
./.zsh
$ echo./**/.zshrc
./.zsh/.zshrc./skel/.zshrc
$ echo./**/booo
bash: no match:./**/booo
0
28.01.2020, 02:39

Теги

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