代码之家  ›  专栏  ›  技术社区  ›  Chan Kim

如何将模式从后引号输出附加到每个列表成员?

  •  0
  • Chan Kim  · 技术社区  · 7 月前

    例如,如果我这样做 git diff --name-only 在git本地目录下,该命令返回从git根目录中看到的文件列表,如下所示。

    ab21/ab21_universe.sv
    ab21cv/apzeus/aarch64/cvp_earth/hello_world/Makefile.inc
    ab21cv/apzeus/aarch64/shared/stackheap.s
    ab21cv/apzeus/cvp_category/cvp_earth/hello_world/hello_world.c
    ab21cv/apzeus/cvp_category/shared/ab21x_zeus_uart.h
    

    但是,由于我现在位于git根目录下的simab21/sim_rtl目录中,要对这些文件执行操作,我必须附加 ../.. 到上面输出的每个成员。例如,对于这个问题,如果我想 cat 对于那些文件,我应该这样做吗?我可以做这样的事情

    for i in `git diff --name-only`
    do
    cat ../../$i
    done
    

    但我不能做ls-ltrd git diff--仅限名称 (阴影中的字符位于后引号内),因为 git diff--仅限名称 输出从git根目录中看到的文件列表。希望我能解释清楚。我该怎么做?

    1 回复  |  直到 7 月前
        1
  •  1
  •   choroba    7 月前

    您可以使用 sed 要修改文件名:

    ls -ltrd $(git diff --name-only | sed 's=^=../../=')
    

    (注意,我用过 $(...) 而不是反引号,因为它们嵌套得很干净)。

    只有当文件名不包含空格时,这才有效。

        2
  •  1
  •   Ed Morton    7 月前

    由于“该命令返回从git根目录中看到的文件列表”,将git根路径放在每个路径前面,而不是 ../.. 因为如果您从任何其他目录运行它,后者会中断吗?例如使用任何awk:

    git diff --name-only | awk -v g=$(git rev-parse --show-toplevel) '{print g "/" $0}'