Как завершить поиск после первого совпадения?

Respondiendo a mi propia pregunta :Parece que no puede instalar ccrypt a través de paquetes. La única forma de hacerlo funcionar era:

  • descargue el archivo tar.gz precompilado desde aquí
  • chown user:user *todos los archivos a mi nombre de usuario actual
  • Entonces pude ejecutar ccrypt

-1
23.04.2019, 03:11
1 ответ

В настоящее время ваш скрипт написан таким образом, что он будет запускаться find, а затем запускать grepдля каждого найденного файла, для каждого ip, который он находит в ips.txt.

Вам не нужно запускать findкаждый раз, чтобы получить один и тот же список файлов, поэтому удалите его из цикла whileи назначьте его переменной. Вам также не нужно запускать grepдля каждого найденного файла, вы можете искать их все одной командой. Теперь, когда у вас есть список файлов, вы можете выполнить grepдля каждого ipи вернуть только первое совпадение. Теперь скрипт будет выглядеть примерно так:

files=$(find. -maxdepth 1 -type f -not -name ips.txt -not -name results.res)
while read ip; do
    grep --with-filename --max-count=1 "$ip" $files | head -n 1 >> results.res
done < ips.txt

Это будет grepчерез каждый файл из команды findдля каждого ipв ips.txtи должно содержать строки, содержащие каждый IP-адрес,и первый файл, в котором он был найден в results.res.

РЕДАКТИРОВАТЬ:

После некоторого тестирования оказалось, что есть лучший способ, поскольку предыдущий код вообще не обрабатывает имена файлов с пробелами или нечетными символами. Поэтому я собираюсь избавиться от find, поскольку здесь он кажется ненужным.

Вы планируете grepпросматривать все файлы в текущем каталоге, кроме results.resи ips.txt, поэтому вы можете использовать grepвообще без поиска:

while read ip; do
    grep --with-filename --max-count=1 --exclude={results.res,ips.txt} "$ip" * | head -n 1 >> results.res
done < ips.txt
0
28.04.2021, 23:34

Теги

Похожие вопросы