検索からgrepへのパイプ


8

私は何をしようとしていますか?

プロジェクト内の他のファイルで必要とされていないファイルを探すコマンドを記述します。

何を試しましたか?

findファイル名のリストを取得するために使用しています。次に、検索するファイルではなく、ファイル名を検索文字列として使用します。

私はfind server/lib -type f -exec basename {} \; | cut -f 1 -d '.'ファイル名のリストを取得し、ファイル拡張子を取り除くために使用しています。

これgrep -R --exclude-dir=node_modules <search-string> . -lが、各ファイル名をパイプしたいものであることはわかっていますが、それらを<search-string>引数として渡す方法がわかりません。


他の情報

また、これにパイプするgrepと、find明らかにしたくない(ファイルのリスト全体)の結果全体が渡される可能性があることも漠然と認識しています。

また、(これはおそらくこの質問の範囲内ではありませんが)grep何も見つからないファイル名を見つける方法としてこれを使用しているので、この種の出力を取得するためのアドバイスは大歓迎です

> <the-command>

filename1
server/lib/foo.js # where these are the list of files in which it appears
test/lib/foo.js

filename2
Not Found! #where `filename2` wasn't found anywhere (obviously)

回答:


2

簡潔な答え:

一連の行を引数として別のコマンドに渡すだけの場合xargsは、友だちです。この場合、コマンドの途中にそれを配置しているので、-I {}フラグを使用します。これは{}プレースホルダーとして設定されるので、どこにでも置くことができます(独自のプレースホルダーを設定できますが、{}他の多くのことと間違われないので、私は通常固執します。

すべてをまとめる(与えたコマンドが、あなたが思っていることを実行すると仮定します!):

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} grep -R --exclude-dir=node_modules {} . -l

長い答え

わかりましたので、これをさらに進めることができます。あなたはあなたが先に述べた形式を望んでいたとしましょう-あなたができるxargsためにsh -cあなたがチェーンのコマンドをすることができます:

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l"

私のマシンでこれを実行すると、ファイル見つかった場所にファイルが提供されているようです。私の脳は疲れているので、それを素敵なスクリプトで包む代わりに(これは、onelinersが危険になり始めたときに実際に行うべきことであり、その間にhttps://www.shellcheck.net/を使用します)代わりに、この恐ろしいハックを使用してください。これにより、(私が思うに)探している出力が得られます。

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l && printf \"\n\" || printf \"Not found\n\n\""


ありがたいことに、はいxargs -I {}、私が探していたものです。
Simon Legg 2017年

6

zsh

projects=(server/lib/**/*(D.:t:r))
grep -rFl --exclude-dir=node_modules -e${(u)^projects} .
  • **/再帰的グロビング。zsh90年代初頭にによって導入された機能。
  • (D.:t:r)はglob修飾子で、zsh名前以外の属性を使用してファイルを選択したり、ソートを変更したり、見つかったファイルを変更したりできる-固有の機能です。
  • D:ドットファイルを含め、ドットディレクトリをトラバースしますfind。ほとんどの場合、あなたはそれを外したいと思うでしょう。
  • .:のみの通常のファイル(のよう-type ffind
  • :t:rcsh/のような履歴修飾子ですbashが、ここではグロブファイルに適用されます。:t尾(ベース名)、:rルート名(拡張子は削除)。
  • x${^array}以下のような要素を配布するrcx^$arrayfishx$arrayだろうが。たとえば、$array12)の場合。それになりx1 x2ます。
  • ${(u)array}uniqueの場合)、重複を削除(u)します(パラメーター展開フラグです)。

含まれていないファイルの一覧についてはどれも文字列のを、交換する-l-L(GNUを想定しgrepていますが、すでにここGNU固有のオプションを使用しています)。-F固定文字列検索用です(おそらく、これらのプロジェクト名を正規表現として扱いたくないので)。また、たとえば、一致しない(ただし、一致する)よう-wgrep単語一致のオプションを追加することもできます。foofoobarfoo-bar


これと説明に感謝します。zshでprojects=(server/lib/**/*(D.:t:r))そのような配列を作成することには気づきませんでした。ただし、grep何も見つからなかったファイルをリストする必要があります。私は0 / falseの終了コードをキャッチする必要があると思いますか?
Simon Legg 2017年

@Simonは、およそ部分を見る-Lの答えの最後に
ステファンChazelas

はい、見ました。-l検索結果の場所と、-L見つからなかった場所を通知します。しかし、どこにあるのか/どこにないのかではなく、どこにも見つからなかった検索語のリストを知りたいのですが
Simon Legg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.