「find」からjqへの複数のファイルパイプ

「find」からjqへの複数のファイルパイプ

プロジェクトのnode_moduleフォルダにある特定のノードパッケージのすべてのバージョンをインポートしようとしています。

package.jsonファイルが複数あり、"依存関係":{"package-name"}の下のファイルを"grep"したいと思います。

サンプルJSONファイル:

{
  "dependencies": {
    "some-package": "^1.1.1",
    "some-package": "^1.0.1",
    "the-package-i-am-looking-for": "1.2.3"
  },
  "devDependencies": {
    "some-package": "^1.7.3",
    "some-package": "^2.0.0"
  }
}

ファイル名と行を知りたいです。 (だからgrep)

したがって、理想的には、出力は次のようになります。

some-package/package.json: "the-package-i-am-looking-for": "1.2.3"
some-other-package/package.json: "the-package-i-am-looking-for": "2.3.4"

私はUnixパイプを初めて使用します。これが私が思いついたものです。これは明らかに動作しません

find . -name package.json | xargs cat | jq '.dependencies' | grep '"the-package-i-am-looking-for"'

ご協力ありがとうございます

ベストアンサー1

catソースファイルの名前は、パイプラインのダウンストリーム部分からアクセスできません。そのcat時点からパイプに到達するすべては、1つ以上のファイルの内容で構成されるデータです。

信じるあなたが探しているものは次のとおりです。

find . -type f -name package.json \
    -exec jq -r --arg pkg 'the-package-i-am-looking-for' \
        '.dependencies | .[$pkg] // empty | [input_filename,$pkg,.] | @tsv' {} +

これにより、タブで区切られた3つのフィールドのリストが出力されます。

  1. パッケージが見つかったファイルのパス名。
  2. パッケージ名。
  3. バージョン文字列。

このfindコマンドjq一括jq見つかったパス名は、できるだけ少数の呼び出しが完了するように出力を生成するために使用されます。{} +最後のファイルは-exec収集されたファイル名に置き換えられます。

このjq呼び出しは入力ファイルを解析し、値を抽出し.dependencies、探しているパッケージに対応するキーのバージョン文字列を取得して出力を生成します。区切りリストである文字列自体@tsv

出力形式は必要に応じて変更できます。 CSV形式で出力するように@tsv変更できます。@csv

現在のディレクトリとディレクトリ名に提供されているファイルのコピーの例(形式の問題が修正されました)dir

$ tree
.
|-- dir
|   `-- package.json
`-- package.json

1 directory, 2 files
$ find . -type f -name package.json -exec jq -r --arg pkg 'the-package-i-am-looking-for' -e '.dependencies | .[$pkg] // empty | [input_filename,$pkg,.] | @tsv' {} +
./package.json  the-package-i-am-looking-for    1.2.3
./dir/package.json      the-package-i-am-looking-for    1.2.3

find間にパイプが本当に必要だと思われる場合は、xargs次の移植不可能なコードを使用できます。

find . -type f -name package.json -print0 |
xargs -0 \
    jq -r --arg pkg 'the-package-i-am-looking-for' \
        '.dependencies | .[$pkg] // empty | [input_filename,$pkg,.] | @tsv'

すべてを自分で行うことに比べて、このようにすることで得られるものはありませんfind

おすすめ記事