Проверьте, не содержит ли какой-либо из файлов в папке шаблон, а затем верните имя файла. - PullRequest
0 голосов
/ 29 мая 2019

Я пишу сценарий, целью которого является автоматизировать полное заполнение некоторых переменных, и мне нужна помощь для достижения этой цели:

У меня есть папка с поддержкой сайтов nginx, которая содержит несколько обратных прокси-сайтов.Мне нужно:

  1. проверить, найден ли шаблон $ var1 в каком-либо из файлов в "/ volume1 / nginx / sites-enabled /"
  2. и вернуть имя файласодержащие $ var1 в качестве $ var2

Большое спасибо за ваше внимание и помощь!

Я нашел несколько строк, но ни одна из них не попала ни в один файл в папке

if grep -q $var1 "/volume1/nginx/sites-enabled/testfile"; then
  echo "found"
fi

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

Если у вас есть GNU Grep, все файлы, содержащие содержимое $var1, будут сохранены в массиве $var2.

for file in /volume1/nginx/sites-enabled/*
do
    if grep --fixed-strings --quiet "$var1" "$file"
    then
        var2+=("$file")
    fi
done

Этобудет проходить через пути, разделенные NUL:

while IFS= read -d'' -r -u9 path
do
    …something with "$path"
done 9< <(grep --fixed-strings --files-without-match --recursive "$var1" /volume1/nginx/sites-enabled)
0 голосов
/ 29 мая 2019

find и grep могут быть использованы для создания списка подходящих файлов:

find /volume1/nginx/sites-enabled/ -type f -exec grep -le "${var1}" {} +

«Уловка» использует find s -exec и grep-l.

Если вам нужны только имена файлов, вы можете использовать:

find /volume1/nginx/sites-enabled/ -type f -exec grep -qe "${var1}" {} \; -exec basename {} \;

Если вы хотите присвоить результат переменной подстановки команды use ($()):

var2="$(find …)"

Не забудьте процитировать ваши переменные!

0 голосов
/ 29 мая 2019

Эта команда является самой традиционной и эффективной, которая работает на любом Unix без необходимости иметь GNU-версии grep со специальными функциями.

Эффективность заключается в том, что xargs передает команду grep столько же имен файлов, сколькоаргументы, насколько это возможно, в соответствии с ограничениями системы (насколько длинна может быть команда оболочки), и она исключает команду grep при этом только как можно меньше.

С параметром -l команды grep он показываетвы только имя файла один раз в успешном поиске по шаблону.

find /path -type f -print | xargs grep -l pattern
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...