【问题标题】:How to store the result of find in bash array, to use result as file path in bash script? [duplicate]如何将 find 的结果存储在 bash 数组中,以将结果用作 bash 脚本中的文件路径? [复制]
【发布时间】:2020-03-11 18:59:38
【问题描述】:

在 bash 数组中使用以下命令时,会丢失数组元素的行分隔。

array=$(find "${PWD%/*}" -name '*.dmg')

如果我重定向 find 命令的路径,而不是将其存储在变量中,而是将其存储到文本文件中,它会给出所需的结果。

find "${PWD%/*}" -name '*.dmg' > Out.txt

但我想将结果用作 Bash 中的变量并循环遍历它。 在这种情况下,find 命令应该返回一个数组,其中包含一个目录中所有 .dmg 文件的路径。我想用hdiutil mount 命令循环遍历这个数组,以便挂载目录中的所有.dmg 文件。

【问题讨论】:

  • 下次请格式化代码,这次我做了修改。
  • 谢谢你。这是我在堆栈溢出中的第二篇文章,我仍在学习如何在这里进行交互。但感谢您的改进。
  • 没问题AFouquet,欢迎!
  • 您根本没有定义数组;您只是将find 的输出捕获为单个字符串。
  • 另外,您假设(也许有充分的理由)文件名本身不包含换行符。

标签: arrays bash macos find


【解决方案1】:

您可以使用mapfile 将找到的文件安全地传输到数组中。

#!/usr/bin/env bash
declare -a array

mapfile -d '' array < <(find "${PWD%/*}" -name '*.dmg' -print0 2>/dev/null)

find -print0 选项生成空分隔字符串,因此文件名中的空格、制表符和回车符可以安全地保留。

mapfile -d '' array 读取 stdin 并使用空分隔符填充 array

&lt; &lt;(commands group) 将命令组的输出注入到其他命令组的stdin

结果是,find 的输出映射到array

对于缺少 mapfile 的 MacOS 的旧版 Bash 3.2,这是填充 array 的另一种方法:
#!/usr/bin/env/bash

declare -a array

while read -r -d ''; do
    array+=("$REPLY")
done < <(find "${PWD%/*}" -name '*.dmg' -print0 2>/dev/null)

【讨论】:

  • 我会试一试,得到结果后会回复你。谢谢你:)
  • 刚刚得知我在 OSX 中没有 mapfile 命令。我将不得不找到一个替代方案。我可能可以用自制软件下载它,而不是每个应该运行脚本的系统都必须先安装它才能使其工作。
  • @AFouquet 如果您想要在任何 macOS 系统上运行的东西,请考虑将其写入 zsh
  • @chepner 总的来说,我对脚本编写非常陌生。使用 zsh 有什么好处?
  • 换句话说:在你的目标机器上预装一个合适版本的zsh(它可以很容易地支持将find的输出读入一个数组)的机会大于合适的版本bash.
猜你喜欢
  • 2023-03-17
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
相关资源
最近更新 更多