プログラミング

find + xargs grep + fgrepでフォルダを再帰的に全文検索する

これでできま…せんでした。できるにはできるのですが、出力が多すぎて見えない。

find /mnt/c/pg/autohotkey -type f | xargs grep "GetKeyState"

この全文検索スクリプトを使う機会があって、いざ使ってみたら…

find /mnt/c/pg/autohotkey -type f | xargs grep "GetKeyState"

grep: ショートカット.lnk: そのようなファイルやディレクトリはありません
grep: /mnt/f/__HDD_BACKUP__/usb_backup/ahk/ショートカット/autohotkey.aux.ahk: そのようなファイルやディレクトリはありません
grep: ショートカット.lnk: そのようなファイルやディレクトリはありません
grep: /mnt/f/__HDD_BACKUP__/usb_backup/ahk/ショートカット/Markdown.ahk: そのようなファイルやディレクトリはありません
grep: ショートカット.lnk: そのようなファイルやディレクトリはありません
grep: /mnt/f/__HDD_BACKUP__/usb_backup/ahk/ショートカット/music.ahk: そのようなファイルやディレクトリはありません
grep: ショートカット.lnk: そのようなファイルやディレクトリはありません
grep: /mnt/f/__HDD_BACKUP__/usb_backup/ahk/ショートカット/myautohotkey.ahk: そのようなファイルやディレクトリはありません
grep: ショートカット.lnk: そのようなファイルやディレクトリはありません
grep: /mnt/f/__HDD_BACKUP__/usb_backup/ahk/ショートカット/Perfect.ahk: そのようなファイルやディレクトリはありません
grep: ショートカット.lnk: そのようなファイルやディレクトリはありません

こんな感じで、うるさい。どこにあるのかわかったもんじゃない。

find /mnt/f/__HDD_BACKUP__/usb_backup/ahk -type f | xargs grep "GetKeyState" | grep "一致しました"

これだと、色がつくて見やすくはなるんだけど、出力は変わらない。

質問してみた。:もし出力にある文字列を含むなら、その出力をnullに渡して標準出力しないようにする。

fgrepなるものがあるらしい。一回だけ聞いたことある…

|& fgrep -v "含みたくない文字列"

grepでも、-vだと含まない場合になります。fgrepも同じなのでわかりやすいですね。fgrepがなんなのかよくわかってないですが。

ではやってみよう。

yuis@DESKTOP-UHU8FSH:/mnt/c/pg/zenkaku_henkan$ find /mnt/f/__HDD_BACKUP__/usb_backup/ahk -type f | xargs grep "GetKeyState" |& fgrep -v "そのようなファイルやディレクトリはありません"
バイナリファイル /mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkコンパイル/fn1-12.exe に一致しました
バイナリファイル /mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkコンパイル/lifehack.exe に一致しました
バイナリファイル /mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkコンパイル/Perfect.exe に一致しました
バイナリファイル /mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkコンパイル/クリック連打.exe に一致しました
バイナリファイル /mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkコンパイル/マウス操作.exe に一致しました
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/021/AutoScroll.ahk:         GetKeyState,state,LButton
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/021/AutoScroll.ahk:         GetKeyState,state,RButton
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:    wpalam  :=GetKeyState("LButton")     | GetKeyState("RButton") <<1
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:            | GetKeyState("Shift")   <<2 | GetKeyState("Ctrl")    <<3

ちゃんとほしい情報だけ出力されていますね。

ちなみに、経緯としては、前GetKeyStateを使ったスクリプトを書いて、それを参考にしたかったんだけど、見つからない…そこで全文検索しようか、という感じです。

でも、これだとまだ情報が多い。

exeファイルとかbinファイルとかも混じっちゃってるし。

自分が書いたものは、.ahkだけで、探しているファイルも確実にahkスクリプトなので、ここはもうひと工夫。

yuis@DESKTOP-UHU8FSH:/mnt/c/pg/zenkaku_henkan$ find /mnt/f/__HDD_BACKUP__/usb_backup/ahk -type f | xargs grep "GetKeyState" |& fgrep -v "そのようなファイルやディレクトリはありません" |& fgrep ".ahk"
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/021/AutoScroll.ahk:         GetKeyState,state,LButton
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/021/AutoScroll.ahk:         GetKeyState,state,RButton
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:    wpalam  :=GetKeyState("LButton")     | GetKeyState("RButton") <<1
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:            | GetKeyState("Shift")   <<2 | GetKeyState("Ctrl")    <<3
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:            | GetKeyState("MButton") <<4 | GetKeyState("XButton1")<<5
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/ahkテンプレ/WheelScroll.ahk:            | GetKeyState("XButton2")<<6
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/2017_05_07_ahk/ahk/temp-auto.ahk:;    If GetKeyState("Shift","P")
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/ahkテンプレ/021/AutoScroll.ahk:            GetKeyState,state,LButton
/mnt/f/__HDD_BACKUP__/usb_backup/ahk/ahkテンプレ/021/AutoScroll.ahk:            GetKeyState,state,RButton

完璧。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です