微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅将 grep 结果过滤到现有文件的路径 Try it online!

如何解决仅将 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?