![bash 命令打印文件名和内容](https://linux22.com/image/765803/bash%20%E5%91%BD%E4%BB%A4%E6%89%93%E5%8D%B0%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E5%86%85%E5%AE%B9.png)
我们有一个包含大量项目的 git repo,每个项目都有一个 OWNERS 文件,其中只有一行,如“teams/search”,没有引号。我想以某种方式找到所有这些文件并创建一个元组数组,其中元组为 [filename, filecontents]。
我可以找到所有文件
find java -name "OWNERS"
很好,或者我可以像这样 cat 内容
find java -name "OWNERS" | cat
但是我该如何创建数组呢?下一步是循环遍历数组(我想我知道如何做到这一点,尽管我的 bash 生疏了),我可以通过 cd 到团队目录并 ln -s {完整文件路径} 创建符号链接
答案1
bash 数据结构不够复杂,无法创建元组数组。您可以创建字符串数组或关联数组。
我假设 OWNERS 文件的路径名中没有换行符。
# an array of OWNERS filenames
mapfile -t owner_files < <(find java -name OWNERS)
# an associative array mapping the filename to the contents
declare -A owner_file_contents
for file in "${owner_files[@]}"; do
owner_file_contents["$file"]=$(<"file")
done
# inspect the associative array
declare -p owner_file_contents
Bash 对名称中带有空格的文件名非常敏感,因此您需要用引号括住所有变量。
一些说明:
mapfile -t ary < <(some command)
--some command
在子 shell 中运行并将输出读入数组,每个元素一行。- 无法做到这一点,
some command | mapfile -t ary
因为 bash 在单独的子 shell 中运行管道命令,这意味着数组将在子 shell 中创建,因此当子 shell 退出时数组将消失。 - 參考文獻:
mapfile
命令,3.5.6 流程替代
- 无法做到这一点,
$(<file)
是一种内置方法,$(cat file)
无需调用外部命令。记录在3.5.4 命令替换
答案2
Glenn 的解决方案很棒!我相信 bash 早在 2019 年就更新了他们的数据结构?(我上次检查的)以支持 mapfile..?它与数组配合得很好(经过调整后也适用于地图)。
下面是我快速组合起来用于将内容转储到数组的示例预映射文件版本。
array=( $(find find java -name "OWNERS") )
# loop over it
for i in ${array[@]}
do
file_val= "${i}"
file_contents="$(cat $i)"
echo $i: $file_contents
done