这本质上可能是重复的这个问题,但是据我所知,提供的 perl 脚本在我的情况下不起作用。关于查找多个模式也存在很多问题,但搜索起来却出人意料地困难,因为谷歌似乎没有区分“模式文件”和“文件名模式”。
我想效仿
git status --ignored --porcelain | awk '{print $2}'
在非存储库文件夹中。那是,我想列出与(指定)文件中列出的模式匹配的文件和目录,并具有以下约束:
- 模式是用gitignore 语法,特别是空行和注释应该被脚本忽略;
- 脚本应该从当前工作目录开始;
- 该脚本应该不是走进匹配的目录(即,匹配始终是叶子),或进入符号链接。
这是一个简单的例子:
$> cat .gitignore
*.DS_Store*
tmp/
a/**/foo
$> tree -a .
.
|-- .DS_store
|-- .gitignore
|-- a
| |-- b
| | |-- foo
| | | `-- file
| | `-- tmp
| |-- foo
| `-- tmp
| `-- file
`-- c
|-- .DS_Store?
`-- foo
5 directories, 8 files
$> git status --ignored --porcelain | awk '{print $2}'
.DS_store
a/b/foo/
a/foo
a/tmp/
c/.DS_Store?
如果可能的话,我对既可以在 osx 也可以在 linux 上运行的解决方案特别感兴趣,并且可以扩展以考虑 posix-egrep 格式的模式。对于最后一部分,类似的东西find . -print | egrep -f patternfile
可以工作,尽管这会进入匹配的目录,这可能会使事情变得非常慢。