/ usr / bin - это общие общесистемные двоичные файлы, которые содержат большинство исполняемых файлов (т. Е. Готовых к запуску программ), которые не требуется для загрузки (т. е. запуска) или восстановления системы.
/ usr / local / bin предназначен для программ, которые может запускать обычный пользователь.
Чтобы проверить содержимое последней строки каждого файла в текущем каталоге, используйте tail
иgrep
:
for file in *.txt
do
tail -1 -- "$file" | grep -q "must have" || printf '%s\n' "$file"
done
Предполагается, что имена ваших текстовых файлов заканчиваются на .txt
; отрегулируйте этот подстановочный знак по мере необходимости. tail -1
захватывает последнюю строку файла (с поиском назад, что более эффективно, чем потенциальное чтение файла вперед ); эта строка затем направляется в grep
для поиска нужного текста. Флаг -q
для команды grep сообщает ему, что он должен молчать о своей работе, и просто устанавливает соответствующий код возврата. Если grep не не находит совпадение, то чередование ||
"или" указывает оболочке выполнить printf
, которая печатает имя файла.
Вы можете поместить этот код в скрипт или в функцию:
lastlinehas() {
for file in *.txt
do
tail -1 -- "$file" | grep -q "$1" || printf '%s\n' "$file"
done
}
Использование GNUawk
:
$ awk 'ENDFILE { if ($0 !~ /must have/) print FILENAME }' file2.txt file1.txt
file2.txt
Здесь используется блок ENDFILE
для проверки текущего содержимого$0
(последней строки файла, до которого мы только что дошли до конца )относительно регулярного выражения must have
. Если совпадений нет, печатается имя файла.
Блок ENDFILE
недоступен в BSD awk
или mawk
.
Использование стандартаawk
:
for fname in *.txt; do
awk 'END { if ($0 !~ /must have/) print FILENAME }' "$fname"
done
Это работает аналогично решению GNU awk
, но вызывает awk
один раз для каждого файла.