Самый быстрый способ найти файлы, которые содержат исключительно некоторый текст

Я принимаю USB, Вы имеете в виду pendrive или внешний жесткий диск, смонтированный к Вашей файловой системе. Вы "отсоединяете" это путем размонтирования устройства. Для этого необходимо будет использовать команду umount. Можно использовать устройство или точку монтирования, например:

umount /dev/sdb1 или umount /mnt/usb

Посмотрите человека umount для получения дополнительной информации.

Для того, чтобы закрыть Вашу систему, Вы используете shutdown команда. -h "Остановится или выключится после завершения работы". В странице справочника говорится:

SYNOPSIS
       /sbin/shutdown [-akrhPHfFnc] [-t sec] time [warning message]

Таким образом, можно использовать его для завершения работу системы после определенного количества времени. Следующая команда остановит Вашу систему после 30 минут:

shutdown -h 30

Теперь у Вас есть одна команда, которая должна только выполняемый после того, как другой был succesfull. Это сделано с &&, сокращением от условного оператора и функции Вашей оболочки (Примечание: || существует также). Вторая команда будет только выполняться если первая, возвращенная без любых ошибок. Это обозначается кодом возврата 0. Например:

umount /dev/sdb1 && shutdown -h 15 отсоединит Ваш USB и остановит Вашу систему после 15 минут.

Если это не отвечает на Ваш вопрос, более конкретны.

3
26.07.2012, 18:02
6 ответов

Что-то как...

ps ax|grep ntpd|cut -b1-5|xargs -I PID find /var/run/ -type f -exec grep '-l' '^PID$' {} ';'

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

start(^)
string (PID is replace by value sent to `xargs`)
end($)

PS: Я протестировал это путем выполнения ps ax > /var/run/psaxdump сопровождаемый вышеупомянутым. Это только нашло ntpd.pid

0
27.01.2020, 21:13
  • 1
    Смешивание в a head -1 помог бы постараться не напрасно тратить время, читая в любых неожиданно огромных файлах. Если бы Вы хотите быть действительно педантичными, даже который имел бы ложные положительные стороны для файлов, которые запустились с PID на строке отдельно, но содержали другие данные. –  Jander 27.07.2012, 16:53
  • 2
    ядра grep только делает мудрое строкой сравнение. Как Jander отметил выше, это может привести к ложным положительным сторонам, так как любой файл, содержащий строку поиска, будет соответствовать. Подход жабр является намного более звуковым. –  jw013 27.07.2012, 17:45

Поместите требуемый текст в файл, затем работайте cmp на каждом файле кандидата.

pgrep myproc >/tmp/the_pid
find /var -type f -size $(wc -c </tmp/the_pid)c -exec cmp -s /tmp/the_pid {} \; -print

Но для этого варианта использования, я перезапустил бы программу под strace -eopen или с auditd правило:

auditctl -F "ppid=$$,a2&0x100" -S open
/path/to/daemon
3
27.01.2020, 21:13
  • 1
    , который породит много процессов cmp, которые выйдут, после того как они видят файл, имеет другой размер. использование моей находки ответа сделало бы, то утверждение и намного меньше процессов будут порождены –  Janus Troelsen 27.07.2012, 20:41
  • 2
    @govinda я добавил пример для ситуации, которую Вы обрисовали в общих чертах. Если Вам нужна проверка URI, чтобы только проверить подпапку, изменение ^index\.html кому: ^yoursubfolder/index\.html ---------121 положительная сторона--------199430----@ysangkok, которую я заметил в Вашем ответе, но не думал при записи моего (чтобы рекомендовать перезапустить и использовать strace, и также предложите cmp вместо diff). –  Gilles 'SO- stop being evil' 27.07.2012, 21:03

Можно передать Регулярное выражение grep, попробовать это: (принятие PID 67543),

grep -R '^67543$' /

В регулярном выражении ^ морковь (SP) средства символа "запускается строки", и $ конец "средств символа знака доллара строки", таким образом, regex выше только возвратит результат, где файл запускается и заканчивается строкой "67543".

1
27.01.2020, 21:13
  • 1
    "только [...], где файл запускается и заканчивается". Ложь! Это найдет все файлы с любым согласующим отрезком длинной линии! $ grep-R дерево поиска "^donkey$" searchtree/test1:donkey-c searchtree/test1 0000000 d o n k e y \n b i g m передозировки $, n \n 0000017 –  Janus Troelsen 26.07.2012, 18:18
  • 2
    @ysangkok Вот почему я не использовал расширенный regex. Вы - также бесполезно "catting" файл, мой пример не сделал таких вещей. Только возьмите остатки кода и вставьте его в несовместимый код и ожидайте, что это будет работать. –  Tim 26.07.2012, 18:25
  • 3
    grep и строки возвратов, не файлы. Рекурсивный grep возвратит любой файл, содержащий строку, которая является точным совпадением. Я не думаю именно это вопрос, который задают. –  jw013 26.07.2012, 18:31
  • 4
    @Tim: расширенный regex не имел никакого значения, я удалил его. catting был сделан, чтобы показать Вам, что файл имел две строки даже при том, что мы ищем файл с одной строкой. Вот почему я изменил его на od. Я изменил бы его больше и сделал бы его более симпатичным, если 5 минимальных крайних сроков редактирования не истекли. od не часть решения, она должна показать Вам что grep дает неправильный результат для этой проблемы. –  Janus Troelsen 26.07.2012, 18:40
find searchtree -type f -size `stat -c%s needle`c | xargs -n1 diff -s needle
1
27.01.2020, 21:13
  • 1
    Там должен быть чем-то, которое я делаю неправильно... Скажем, я пытаюсь найти 1234 в файлах в/tmp/... Если я делаю это: найдите/tmp/-тип f - размер stat -c%s 1234c | разность xargs-n1-s 1234 я получаю следующие ошибки: статистика: не может статистика 1234': No such file or directory find: Invalid argument c' к - разность размера: недостающий операнд после 1234' diff: Try разность - помогает' для получения дополнительной информации. –  BorrajaX 26.07.2012, 18:20
  • 2
    Вы получаете команду, как произведено при выполнении его? невозможная попытка –  Janus Troelsen 26.07.2012, 18:21
  • 3
    , редактируя Ваш вопрос и добавляет ошибки, я думаю, что поле комментария, слишком маленький –  Janus Troelsen 26.07.2012, 18:22
  • 4
    Извините, очень тяжелый случай скопировать/вставить. Я зафиксировал его –  BorrajaX 26.07.2012, 18:26
  • 5
    ах. просто необходимо поместить шаблон/иглу в файл. можно сделать это с echo -n "thisiswhatiwanttosearchfor" > needle. удалите "-n", если Вы хотите запаздывающую новую строку, которую Вы получаете на значение по умолчанию в большинстве текстовых файлов. если Ваш файл "иглы" называют "1234", конечно, необходимо использовать это вместо "иглы". соответствия –  Janus Troelsen 26.07.2012, 18:29

если pcregrep доступен в Вашей установке, Вы могли бы передать-l (перечислите имя файла),-r (рекурсивный) и-M (многострочные) флаги к нему, чтобы сделать задание. Обратите внимание, что \A и \Z представляют, запускаются и конец строковых привязок. В примере ниже, 12477 искавшая строка

pcregrep -l -r -M '\A12477\Z' dir
1
27.01.2020, 21:13

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

Если Вы знаете PID, Вы знаете, что это - длина, таким образом, можно сократить количество файлов для поиска еще больше:

 find -type f -mmin -1 -size 6c -exec grep 12345 {} \;

Для 5 цифр использование PID 6c как размер, так как они содержат запаздывающую новую строку (от ysangkok как комментарий).

1
27.01.2020, 21:13
  • 1
    файлы PID имеют запаздывание новых строк, таким образом, необходимо изменить 5 –  Janus Troelsen 26.07.2012, 18:59

Теги

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