AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1060822
Accepted
Dean Hiller
Dean Hiller
Asked: 2021-04-20 04:43:57 +0800 CST2021-04-20 04:43:57 +0800 CST 2021-04-20 04:43:57 +0800 CST

bash 命令打印文件名和内容

  • 772

我们有一个包含大量项目的 git 存储库,每个项目都有一个 OWNERS 文件,其中一行像“teams/search”,没有引号。我想以某种方式找到所有这些文件并创建一个元组数组,其中元组是[文件名,文件内容]。

我可以找到所有文件

find java -name "OWNERS" 

很好,或者我可以像这样对内容进行分类

find java -name "OWNERS" | cat

我怎样才能创建数组呢?之后的下一步是遍历数组(我想我知道如何做到这一点,尽管我的 bash 生锈了),我可以通过 cd 创建符号链接到团队目录和 ln -s {full file path}

bash
  • 2 2 个回答
  • 661 Views

2 个回答

  • Voted
  1. Best Answer
    glenn jackman
    2021-04-20T05:05:45+08:002021-04-20T05:05:45+08:00

    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 退出时数组将消失。
      • refs: mapfilecommand , 3.5.6 进程替换
    • $(<file)$(cat file)是一种无需调用外部命令的内置方式。记录在3.5.4 命令替换中

    • 2
  2. Madan
    2021-04-20T05:27:57+08:002021-04-20T05:27:57+08:00

    格伦的解决方案效果很好!我相信 bash 早在 2019 年就更新了他们的数据结构?(我检查的最后一个)支持mapfile..?它适用于数组(并且调整也适用于地图)。

    下面是一个示例 pre-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
    
    • 1

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve