如何为git diff --name-only输出的文件路径添加上级目录前缀?
问题
在Git本地目录执行git diff --name-only命令时,会返回基于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子目录,对这些文件执行操作时需为每个路径添加../..前缀。例如用for循环可实现cat操作:
for i in `git diff --name-only` do cat ../../$i done
但直接执行ls -ltrd \git diff --name-only``无法生效,如何实现此需求?
解决方法
方法1:for循环遍历处理
沿用cat操作的逻辑,为每个文件路径添加前缀后调用ls:
for file in $(git diff --name-only); do ls -ltrd "../../$file" done
方法2:xargs + sed批量处理
通过sed为每一行路径添加../../前缀,再用xargs传递给ls:
git diff --name-only | sed 's/^/..\/..\//' | xargs ls -ltrd
sed 's/^/..\/..\//'会在每个路径的开头插入前缀,确保路径指向正确的文件位置。
方法3:切换到Git根目录执行
先获取Git根目录路径,切换到根目录后直接执行ls,最后返回原目录:
GIT_ROOT=$(git rev-parse --show-toplevel) cd "$GIT_ROOT" && ls -ltrd $(git diff --name-only) && cd - > /dev/null
这种方式无需手动添加路径前缀,cd - > /dev/null会返回原目录并屏蔽切换目录的提示信息。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

