У меня есть, чтобы найти список слов в списке файлов. Поэтому я поместил список слов в файл и использовал for
цикла, пытаясь прочитать каждое слово в файле и использовать команду find для grep
для этого слова в списке найденных файлов.
Я использую упомянутый вкус Linux
bash-3.1$ uname HP-UX
Ниже приведен мой сценарий оболочки.
#!/bin/sh PATH="/NO/20171013" STRING=`/usr/bin/cat /home/test/STAT44_test.txt` for LINE in ${STRING} do echo "find ${PATH} -type f -name \"*.txt\" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l" LINES=`find ${PATH} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | /usr/bin/wc -l` echo "LINES count is ${LINES}" if [ ${LINES} -eq 0 ] then echo "In not found" # echo "${LINE} is not found in ${PATH}" >> /home/test/STAT44_not_found.out else echo "In Found" # echo "${LINE} is found in ${PATH}" >> /home/test/STAT44_found.out fi done
Команда find find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null
find ${PATH} -type f -name "*.txt" -exec grep -w '${LINE}' {} \; 2>/dev/null
отлично работает в командной строке, тогда как он не дает никакого вывода, если он используется в сценарии оболочки, как указано выше.
Вывод echo $?
0, но команда find не выводит никакого вывода.
Вывод скрипта
find /NO/20171013 -type f -name "*.txt" -exec grep -w 655044810645 {} \; 2>/dev/null | /usr/bin/wc -l LINES count is 0 In not found find /NO/20171013 -type f -name "*.txt" -exec grep -w 734729751028 {} \; 2>/dev/null | /usr/bin/wc -l LINES count is 0 In not found
На самом деле файлы *.txt
под /NO/20171013
имеют файлы с рисунком 655044810645
и 734729751028
. Следовательно, Word count
не должно быть 0, и оно должно попасть в else
часть.
Что может быть пропало?
Сначала создайте правильную $PATH
(и посмотрите ответ Камила Макоровского ):
Войдите в систему с подходящим пользователем (root?) И выполните:
echo PATH=$PATH
Добавьте вывод в начало скрипта
ИЛИ вы можете добавить полный путь для find
команды. Если вы не знаете, где find
, выполните:
which find
Результат будет таким: /usr/bin/find
И у вас есть ошибка внутри цикла :
Вам нужно заменить одиночные кавычки на двойные (около ${LINE}
), иначе переменная не будет интерпретироваться:
echo "find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l" LINES=`find ${PATHS} -type f -name "*.txt" -exec grep -w "${LINE}" {} \; 2>/dev/null | wc -l`
Некоторые примечания:
cat file
, попробуйте использовать цикл. Но используйте только while
, а не for
! Чтение Почему вы не читаете строки с «за» и как я могу читать файл (поток данных, переменную) по очереди (и / или поле за полем)? $PATH
– важная переменная со значением . Вы должны выбрать другое имя.
В этом случае find
исполняемый файл невозможно, потому что $PATH
не приводит к нему. Вы не уведомлены из-за 2>/dev/null
.
echo
, вероятно, является встроенной оболочкой, для работы не требуется $PATH
. То же самое for
и т. Д.