Если у Вас нет чего-то как zsh
, это не совершенно тривиально. Вероятно, более эффективно получить хиты, затем вид ко времени изменения каждого файла с хитом.
grep -rl 'regex' . |
while read -r file; do
stat -c '%Y:%n' "$file"
done | sort | cut -d: -f2-
Это, очевидно, повредится, если у Вас будут имена файлов с новыми строками на их именах или чем-то.
[
(это команда)-n
для проверки, является ли длина строки ненулевой, или -z
для проверки, является ли она нулевойИтак:
read finding
if [ -z "$finding" ]; then
echo "You didn't enter anything"
else
grep "$finding" information.txt
if [ ! "$?" -eq 0 ]; then
echo "No such information in database."
fi
fi
i=0
until [ "$((i+=1))" -gt 5 ] || {
printf '\nPrompt: '
read finding && [ -n "$finding" ]
};do printf '\nINVALID:\tTry again.\n'
done <>/dev/tty >&0
grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt ||
! printf '%s:\tNot found in database.' "$finding" >&2
Вы должны проверить не только то, что $finding
не является нулевым, но и то, что read
успешно завершается - и поэтому настройка его в первую очередь. В описанном выше цикле перед выходом из состояния w/ error 5 раз будет запрошена и попытка прочитать из терминала строку с не нулевым входным сигналом.
"${расширение:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
$finding
обрабатывается как побочный эффект параметра ${
${:?
expansion}
и приводит к сообщению, записанному на stderr
и немедленному выходу из неинтерактивной оболочки. cmd ...
- Это синтаксическая ошибка - попытка перенаправления из файла, который не может быть открыт (например, из файла, который не существует или для которого действующий UID/GID не имеет разрешений на чтение), и поэтому если
info.txt
по каким-либо причинам является недействительным, неинтерактивная оболочка записывает диагностическое сообщение на stderr
и также немедленно выходит из него. Это также верно, если попытка прочитать
превышает ограничения, установленные в ulimit
- и одинаково применимо к начальному циклу до ... выполнения <>в >&out
.
grep ... || ! printf '%s: fmt' "$param"
grep
, единственные два возможных результата вышеуказанной формы - это то, что grep
хотя бы один раз совпадает с шаблоном в "$finding"
и записывает соответствующие строки в stdout
или что он не совпадает даже один раз и возвращает значение, отличное от 0. В последнем случае printf
записывает информационное сообщение на stderr
и возвращает 1. Использование некоторых логических операторов (Начиная с @jimmij)
grep -q "$finding" information.txt
ведет себя как логический ответ (ничто не печатается со статусом возврата 0, если найдено, в противном случае ненулевым).
grep -F -- "$finding" ...
ищите текст вместо regexp (удалите его, если хотите.
для поиска регэкспо... могут быть некоторые риски безопасности... (спасибо @StephanChazelas))
read finding
if [ -z "$finding" ]; then
echo "You didn't enter anything"
else
grep -qF -- "$finding" information.txt && echo "found" || echo "not found"
fi
или даже
[ -z "$finding" ] &&
echo "nothing entered" ||
grep -qF -- "$finding" information.txt || echo "not found"
(хотя будьте осторожны, он также будет запускать второй grep
и/или echo
, если первое echo
не удается)
Edit 1 > объяснить grep -q ...
Конечно.
В нормальных ситуациях статус grep return равен 0 (и просто возвращает "не 0", если произошла ошибка (например, файл не найден))
grep -qF exp file
"возвращает" 0, если находит exp в файле, ошибка в противном случае (grep -q exp file
сделал бы это, если бы регенерация exp
была бы совпадена в файле ).
Это поведение может быть использовано в управляющих операторах bash (if,elif, while, &&, ||,etc)
read f
if [ -z "$f" ]; then
echo "You didn't enter anything"
elif grep -qF -- "$f" information.txt; then
echo "found"
else
echo "not found"
fi