Как найти файлы, содержащие один критерий, но исключающие другой критерий

В клиентской ОС NFS вы можете запустить:

showmount -e your_nfs_server_ip

В то же время открыть другой терминал на той же машине и запустить:

netstat -nputw

После этого вы увидите исходящие порты.

В моем случае помогло добавление порта 55493 к NAT маршрутизатора

7
08.10.2016, 20:08
3 ответа

Поскольку статус выхода grep указывает, найдено ли совпадение, вы можете проверить это напрямую как найти предикат (с необходимым отрицанием, ! или -не ), например

find . -type f -name "*.c" \( -exec grep -q "ABC" {} \; ! -exec grep -q "123" {} \; \) -print

-q заставляет grep завершать работу без уведомления при первом совпадении - нам не нужно получать от него известие, потому что мы позволяем find печатать имя файла.

16
27.01.2020, 20:14

Поскольку вы уже используете расширения GNU:

find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
  xargs -r0 grep -L 123

Если вы хотите сделать что-то еще с этими файлами:

find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
  xargs -r0 grep -L --null 123 | xargs -r0 sh -c '
    for file do
      something with "$file"
    done' sh {} +

Или с zsh или bash :

find . -type f -size +2c -name "*.c" -exec grep -l --null ABC {} + |
  xargs -r0 grep -L --null 123 |
  while IFS= read -rd '' file; do
    something with "$file"
  done
8
27.01.2020, 20:14

Для сложных ограничений я предпочитаю использовать язык программирования :Awk

find -name '*.c' \
   -exec awk -v RS="\0" '/ABC/ && !/123/{print FILENAME}' {} \; 
1
27.01.2020, 20:14

Теги

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