首页 > 解决方案 > 仅将 grep 结果过滤到现有文件的路径

问题描述

我正在使用git diffgrep为我提供上次提交中更改的特定文件夹中的所有文件的列表:

paths=$(git diff --name-only HEAD HEAD~1 | grep "desired_folder/")

现在我需要将列表过滤为实际指向现有文件的字符串,并删除不指向现有文件的字符串。我怎样才能做到这一点?

--diff-filter标志对我没有用,因为我需要在一个分支上获取更改列表,然后仅过滤到存在于不同分支上的文件。

编辑 - 示例行为:
输入字符串:

"file1.txt file2.txt folder/file3.txt"

当前文件夹树:

|-- file1.txt
|-- folder/
    |-- file3.txt

预期输出:

# file2.txt got removed, because it does not represent 
# path to an existing file
"file1.txt folder/file3.txt"

标签: bashunixgrepshzsh

解决方案


您可以git diff使用 while 循环遍历结果,语法有点奇怪,以避免创建子 shell:

while read; do
  :
done < <(cmd)

在你的情况下:

while IFS= read file
do
  [ -f "$file" ] || continue # skip non existing files
  echo "$file" # file exists and is a regular file
done < <(git diff --name-only HEAD HEAD~1)

您可以将 grep 放在 git diff 后面,只需注意您需要保留在进程替换中:

< <(git diff ... | grep ...)

while 循环将从git/的输出中读取每一行grep并将该行存储在变量中file

请注意,git diff --name-only显示文件相对于 git repo 的根目录,您可能需要添加--relative以使它们相对于当前工作目录。


推荐阅读