web-dev-qa-db-ja.com

一部のテキストのみを含むファイルを見つける最速の方法

具体的には「something」という内容のファイルを見つけるための最良かつ最速の方法を見つけようとしています。

理由は次のとおりです。PIDをファイルのどこかに保存することはほぼ確実ですが、どこにあるのかわかりません(そして知りたいのですが)。上記のpid(/var/run/myproc.pidなど)の保存に使用できるファイル名を探してみましたが、今のところ成功していません。内容がちょうどその番号のファイルを検索してみてください。 ps -auxまたはtop、またはそのようなツールからPIDを取得し、その番号のみのコンテンツを持つファイルを検索したいと思います。

私はグーグルで探し回っていますが、すべての答えは、その内容の中に「something」...を含むファイルを見つける方法を説明しているようです。少し違うものが欲しい...その「何か」と完全に一致したい

前もって感謝します。

3
BorrajaX

何かのようなもの ...

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
StarNamer

目的のテキストをファイルに入れてから、すべての候補ファイルに対して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

正規表現をgrepに渡すことができます。これを試してください:(PIDが67543であると仮定)

grep -R '^67543$' /

正規表現では、^にんじん(sp)記号は「文字列の始まり」を意味し、$ドル記号は「文字列の終わり」を意味するため、上記の正規表現は、ファイルが文字列「67543」で開始および終了する場合にのみ結果を返します。

1
Tim
find searchtree -type f -size `stat -c%s needle`c | xargs -n1 diff -s needle
1
Janus Troelsen

インストールでpcregrepが使用可能な場合は、-l(リストファイル名)、-r(再帰)、および-M(マルチライン)フラグを渡して、ジョブを実行できます。\Aと\ Zは、文字列アンカーの開始と終了を表すことに注意してください。以下の例では、12477が検索対象の文字列です。

pcregrep -l -r -M '\A12477\Z' dir
1
iruvar

プログラムが起動時または他の無数のプログラムと一緒に起動されていない場合、pidfileはプロセスと同じくらい古いはずです。これは最初は1分未満です。

PIDがわかっている場合は、その長さがわかっているので、検索するファイルの数をさらに減らすことができます。

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

5桁のPIDの場合、サイズとして6cを使用します。これは、末尾に改行が含まれているためです(コメントとしてysangkokから)。

1
user unknown