
プロジェクトの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つのフィールドのリストが出力されます。
- パッケージが見つかったファイルのパス名。
- パッケージ名。
- バージョン文字列。
この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
。