Я бы рекомендовал использовать grep
и коды возврата, чтобы сделать жизнь немного проще.
while read -r LINE
do
find. -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
done < /path/to/fnames.txt
Как это работает:
find. -name "${LINE}"
уверен, что вы знаете это, найдите файлы в текущем каталоге, которые соответствуют${LINE}
| grep "${LINE}"
направить вывод на grep
. Мы делаем это для получения возвращаемого значения, которое find
обычно не дает полезного значения. Если grep
соответствует чему-либо, совпадение будет напечатано, и команда вернет 0. Если ничего не совпадает, ничего не будет напечатано, и будет возвращено ненулевое возвращаемое значение -.
|| echo "${LINE} not found"
||
является каналом ИЛИ, если одна из команд до того, как она вернет не -ноль, она будет выполнена. Таким образом, если grep
возвращает не -ноль (, т. е. не найдены соответствующие файлы ), выполняется это эхо. Если команды перед этим успешны, это не будет выполнено.
Ваша догадка была довольно близка. Вы можете сделать
for w in 'KeyWord1' 'KeyWord2' 'KeyWord3'
do
echo "<HR><BR><B><h2>Search for Keyword: $w<BR></B></h2><ol>" >> temp.txt
grep -lr -Fiw "$w" * | sed -e 's|.*|<li><a href="http://&">&</a></li>|' >> temp.txt
echo "</ol>" >> temp.txt
done
Из соображений стиля я бы изменил это на
for w in 'KeyWord1' 'KeyWord2' 'KeyWord3'
do
echo "<HR><BR><B><h2>Search for $w: KeyWord1<BR></B></h2><ol>"
grep -lr -Fiw "$w" * | sed -e 's|.*|<li><a href="http://&">&</a></li>|'
echo "</ol>"
done > temp.txt
Ваша версия добавит это новое содержимое к ранее -существующему temp.txt
файлу. Если это то, чем ты действительно хочешь заниматься, измените >
обратно на >>
. После этого он (бесконечно )более эффективен открыть temp.txt
для записи один раз на весь цикл а не три раза для каждого ключевого слова.
П.С. Это просто пришло мне в голову что вы, вероятно, написали <html><head>…</head><body>
в выходной файл, прежде чем сделать это, так что, конечно, вам нужно добавить это к этому предварительно -существующему контенту.
Привет, Дэвид. Я бы добавил комментарий к ответу G -Man, но мне нечего сказать.
Просто хотел добавить, что с рекурсивным grep вы, вероятно, захотите указать каталог или каталоги для поиска, а не подстановочный знак, поэтому что-то вроде grep -lr -Fiw "$w". …
вместо.