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

В первую очередь, это указывает на большую проблему. Если у Вас есть пользователи, которым Вы не доверяете в своей системе, необходимо, вероятно, выровнять ее и переизображение.

Имея это в виду, можно сделать некоторых или все следующее:

# set up the environment
$ BADUSER=foo # where foo is the username in question
$ USERLINE=$(grep '^${BADUSER}:' /etc/passwd)
$ BADUID=$(echo ${USERLINE} | awk -F: '{print $3}')
$ BADGID=$(echo ${USERLINE} | awk -F: '{print $4}')
$ BADHOMEDIR=$(echo ${USERLINE} | awk -F: '{print $6}')
$ BDIR="~/backup/home-backup/"
$ TSTAMP=$(date +%F)
$ TAR_FILENAME="${BADUSER}-${TSTAMP}.tar.bz2"
$ OWNED_FILENAME="${BADUSER}-files-${TSTAMP}.txt"

# disable the user's future login
$ sudo chsh -s /bin/false "${BADUSER}"

# kill all of the user's processes
$ BADPROCS=$(ps auwx | grep '^${BADUSER} ' | awk '{print $2}')
$ sudo kill -9 ${BADPROCS}

# back up/clear the user's home directory
$ mkdir -p ${BDIR}
$ sudo tar -cfj ${BDIR}/${TAR_FILENAME} ${BADHOMEDIR}
$ sudo rm -rf ${BADHOMEDIR}/.* ${BADHOMEDIR}/*

# find all files owned by user
$ sudo find / -user ${BADUSER} > ~/backup/${OWNED_FILENAME}

# remove user
$ sudo userdel ${BADUSER}
20
07.01.2012, 20:10
4 ответа

grep -l "string" * | wc -l будет искать "строку" в содержании всех файлов в рабочем каталоге и говорить Вам сколько подобранный.

31
27.01.2020, 19:43
  • 1
    Это не будет работать, если будет много файлов в каталоге, то он бросит ошибку "zsh: список аргументов слишком долго: grep". Какие-либо идеи о том, как избавиться от этого? заметка на полях –   02.03.2012, 08:17
  • 2
    @user16142 grep каталог вместо файлов: grep -lr "string" directory | wc -l Если Вы не хотите рекурсивный поиск, можно использовать, находят с maxdepth опцией: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -l Обратите внимание, что эта вторая опция медленнее, чем grep. –  Agargara 17.10.2017, 03:09

greps параметр -l только произведет имена файлов, которые соответствуют $PATTERN, wc может считать их впоследствии.

grep -l "$PATTERN" * | wc -l
9
27.01.2020, 19:43
  • 1
    спасибо, но задавался вопросом с шаблоном в файле..., извините за неоднозначный вопрос –   29.01.2011, 23:03
  • 2
    Если так, берет ответ Wolf. –  wag 29.01.2011, 23:04
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Разъяснение: Это ищет количество файлов, которое имеет "pattern_to_look_for" в их содержании а не в их именах файлов (как ответ Взмаха). От Вашего вопроса трудно сказать то, что Вы ищете.

3
27.01.2020, 19:43
  • 1
    Но что-то отсутствует? потому что это не работает –   29.01.2011, 23:01
  • 2
    При поиске строковой утки, необходимо записать это как/duck/в Awk. Вы делаете это? –  Jan Persson 29.01.2011, 23:05
  • 3
    да, вывод: awk: читайте ошибка (Каталог), ответ Wolf –   29.01.2011, 23:07
  • 4
    даст, Вы копируете. Если существует несколько происшествий строки, Вы ищете в одном из файлов, это рассчитает как дополнительные соответствия. –  Jan Persson 29.01.2011, 23:08
  • 5
    Ну, если у Вас есть каталоги в папке, необходимо сделать некоторый дополнительный материал как замена звезды с чем-то вроде этого find . ! -name . -prune -type f (не пропускайте обратные галочки). Эта команда только перечисляет файлы в папке. –  Jan Persson 29.01.2011, 23:11

Это работает в Bash с любым именем файла:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Объяснение:

  • grep -Z опция печатает каждый результат с ␀ - разделитель байта. Этот символ не может быть частью имени файла, таким образом, мы можем просто считать количество разделителей для получения количества файлов.
  • Для избавлений от других символов в выводе мы просто удаляем все кроме ␀ использования байтов tr.
  • Затем просто считайте символы с wc.
2
27.01.2020, 19:43

Теги

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