如何解决仅将 grep 结果过滤到现有文件的路径 Try it online!
我正在使用 CREATE INDEX user_id FOR (n:User) ON (n.id)
和 git diff
为我提供特定文件夹中在上次提交中更改的所有文件的列表:
grep
现在我只需要将列表过滤到实际指向现有文件的字符串,并删除不指向现有文件的字符串。我该怎么做?
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
解决方法
您可以使用 while 循环遍历 git diff
的结果,语法有点奇怪,以避免创建子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 存储库根目录的文件,您可能需要添加 --relative
以使它们相对于当前工作目录。
如果您以空格(
) 分隔符字符串结束,我们可以遍历这些文件名,并检查它们是否存在。
#!/bin/bash
res=""
files="file1.txt file2.txt folder/file3.txt"
for path in ${files// / }; do
if [ -f $path ]; then
[ -z $res ] && res="$path" || res="${res} ${path}"
fi
done
echo "$res"
file1.txt folder/file3.txt
Try it online!
警告:由于路径由空格分隔,路径本身应该不包含空格。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。