findからgrepまでのパイプライン

findからgrepまでのパイプライン

私は何をしたいと思うか。

プロジェクトの他のファイルに不要なファイルを検索するコマンドを作成します。

私は何を試みたか。

私は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)

答え1

そしてzsh

projects=(server/lib/**/*(D.:t:r))
grep -rFl --exclude-dir=node_modules -e${(u)^projects} .
  • **/再帰的なワイルドカード。zsh1990年代初頭に導入された機能です。
  • (D.:t:r)zsh名前以外の属性を使用してファイルを選択したり、見つかったファイルの並べ替えや変更を変更したりできる特定の機能であるグローバル修飾子。
  • D:ドットファイルを含み、ドットディレクトリをそのままトラバースしますfind。おそらくあなたはそれを脱ぎたいと思うでしょう。
  • .:一般ファイルのみ(-type ffind:)
  • :t:r:履歴修飾子はcsh/に似ていますbashが、ここではワイルドカードファイルに適用されます。:t尾(デフォルト名)、:rルート名(拡張子が削除されました)。
  • x${^array}rc'sx^$arrayfish'sなどのx$array要素を配布します。たとえば、$array12)の場合です。それになりますx1 x2
  • ${(u)array}uniqueの場合)重複を削除します((u)パラメータ拡張フラグで)。

含まれるファイルのリストの場合まったく文字列-lに置き換えられます-L(GNUを想定していgrepますが、ここではすでにGNU固有のオプションを使用しています)。-F固定文字列の検索に使用されます(これらのプロジェクト名が正規表現として扱われたくないためです)。次の-wオプションを追加することもできます。grep言葉foo一致しませんfoobar(しかしまだ一致)などの一致ですfoo-bar

答え2

短い答え:

これは、複数の行を他のコマンドの引数として渡したい場合にのみxargs適しています。この場合、コマンドの途中に置くので、対応する-I {}フラグを使用することをお勧めします。これは{}どこにでも配置できるようにプレースホルダに設定されています(直接プレースホルダを設定できますが、{}他の多くの項目と混同されないため、私は通常これに固執します。

すべてをまとめてみてください(あなたが提供したコマンドがあなたが思うように機能すると仮定します!):

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

長い答え

さて、多分もう一歩進むことができると思います。前述の形式が必要な場合は、xargssh -cのようにコマンドをリンクできます。

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

私のコンピュータでこれを実行すると、ファイルを含むファイルを提供しているようです。はい確立された。私の脳は疲れているので、きれいなスクリプトで終わらないでください。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\""

関連情報