Find

jq - 將多個文件從“find”傳送到 jq

  • January 24, 2022

我嘗試在項目節點模組文件夾中獲取特定節點包的所有版本。

有多個 package.json 文件,我希望“grep”“依賴項”下的文件:{“package-name”}

範例 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"'

感謝您的幫助

請注意,管道的任何部分(位於 下游cat)都無法訪問原始文件的名稱。從那cat以後,到達管道的只是由一個或多個文件的內容組成的數據。

相信以下內容可能類似於您正在尋找的內容:

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

這將輸出一個由三個欄位組成的製表符分隔列表:

  1. 找到包的文件的路徑名。
  2. 包名。
  3. 版本字元串。

find命令使用成批找到的路徑名呼叫jq生成輸出,以便jq完成盡可能少的呼叫。它的{} +末尾-exec將被收集的文件名替換。

jq呼叫通過解析輸入文件、提取.dependencies值、獲取與我們正在尋找的包對應的鍵的版本字元串以及如果找到某些東西,輸出目前文件名、包名我們正在查詢,版本字元串本身,作為一個製表符分隔的列表,使用@tsv.

可以修改輸出格式以滿足您的需要。您可以更改@tsv@csv以獲取 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

如果您覺得確實需要 和 之間的管道findxargs則可以使用以下不可移植的程式碼:

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

引用自:https://unix.stackexchange.com/questions/687695