【问题标题】:Storing 'find -print0' in intermediate variable without losing nul char将“find -print0”存储在中间变量中而不丢失 nul char
【发布时间】:2020-05-21 23:25:20
【问题描述】:

我有以下命令序列来检查目录中的 JSON 文件:

npm install --global --no-save jsonlint-cli
FILES="$(find . -name '*.json' -type f -print)"
echo -e "Discovered JSON files:\n$FILES"
echo "$FILES" | tr '\n' ' ' | xargs jsonlint-cli

我完全意识到这是一个 NO-NO,因为它不使用 -print0 | xargs -0 模式。

但是,我想保留回显已发现文件的能力,但也只调用一次 findjsonlint-cli

ash can't store \0 in a variable.所以这将工作:

FILES="$(find . -name '*.json' -type f -print0)"
echo -e "Discovered JSON files:\n$FILES" | tr '\0' '\n'  # No effect, '\0' already gone
echo "$FILES" | xargs -0 jsonlint-cli

我怎样才能使用-print0 | xargs -0 仍然保持将发现的文件回显到标准输出的当前行为?

本例中的外壳是ash(在node:alpine Docker 容器内)。

【问题讨论】:

标签: shell xargs ash


【解决方案1】:

看不到任何阻止你这样做的东西:

echo 'Discovered JSON files:'
find . -name '*.json' -type f -print -exec jsonlint-cli {} +

请注意,如果您有太多文件需要将它们拆分成集合,这将无法按您的预期工作。

【讨论】:

  • 为了清楚起见,这确实会为找到的每个文件单独调用jsonlint-cli,对吗? (老实说,我不确定这是否会减慢速度。)
  • @BradSolomon 可能不显着;实际 lint 文件所需的时间应该比启动该过程所需的时间相形见绌。
  • @oguzismail 啊对,我看到了+ 在最后。 (“命令的总调用次数将远远少于匹配的文件数。”)
猜你喜欢
  • 2021-09-07
  • 2021-01-24
  • 2015-01-24
  • 1970-01-01
  • 2018-08-18
  • 2018-03-23
  • 2014-02-27
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多