bash - 仅将 grep 结果过滤到现有文件的路径
问题描述
我正在使用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
预期输出:
# file2.txt got removed, because it does not represent
# path to an existing file
"file1.txt folder/file3.txt"
解决方案
您可以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
以使它们相对于当前工作目录。
推荐阅读
- asp.net - 下拉列表数据库
- css - 如何使 div 可滚动且高度不会导致父元素溢出?
- angular - 更改 html 表数据取决于另一个组件角度 8 的下拉值
- laravel-livewire - Laravel livewire 脚本完整路径
- spring - OpenAPI 使用“oneof”属性从 swagger 生成 spring
- sql - 如何汇总 BigQuery 中排除窗口的列中的所有值,然后将结果设置到此排除窗口中?
- r - 如何迭代rep()中的变量
- python - .pop() 不会为双端队列对象执行
- jquery - 根据 CORS 预检响应 ajax django 中的标头“Access-Control-Allow-Headers”,标头“access-control-allow-credentials”是不允许的
- java - android 6.0以后可以去掉wifi网络吗?