【问题标题】:How to expand bash array in path like brace expansion?如何在大括号扩展等路径中扩展bash数组?
【发布时间】:2022-01-12 09:25:05
【问题描述】:

我有以下目录结构

./a/unknown.txt
./b/unknown.txt

我想要实现的是

cat {a,b}/*.txt

问题是我事先不知道ab,而是我将它们放在这样的数组中

dirs=(a b)

现在,我正在尝试cat ${dirs[@]}/*.txt,但它不起作用。我也尝试过其他的变体,但没有成功。我得到的最接近的是cat ${dirs[@]/%//*.txt},但这不会扩展*。在开头添加eval 可以解决问题,但我觉得需要一种更聪明的方法。

我知道我可以遍历 dirs 并实现我想要的,但我对这个解决方案不感兴趣。

【问题讨论】:

  • 除了使用eval没有别的办法。
  • 请注意,您可以将cat ${^dirs}/*.txt 写入zsh。也就是说,zsh 提供了很多 用于交互使用的快捷方式,但除非你大量使用,否则它们的可读性远不如the loop suggested by @user1934428 .

标签: bash shell wildcard glob brace-expansion


【解决方案1】:
#!/bin/bash

dirs=(a b)

shopt -s extglob

ls @(`echo ${dirs[@]} | tr ' ' '|'`)/*

【讨论】:

    【解决方案2】:

    如果你将它们放在一个数组中,为什么不遍历数组,这将是最清楚的:

    for f in "${dirs[@]}"
    do
      cat "$f"/*.txt
    done
    

    如果你真的不喜欢循环(为什么?)你可以用一个命令来完成:

    find "${dirs[@]}" -maxdepth 1 -name '*.txt'  -exec cat {} \;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多