查找包含特定文件的排除路径

Por*_*ine 2 directory find path git

我试图递归地查找文件夹中的所有目录,同时通过排除所有包含.git文件的路径来排除所有 git 子模块。我怎么能做到?


解释:

.git文件存在于每个子模块文件夹的根目录中。这个子模块文件夹可以包含在任何地方。


测试用例

$ mkdir Test
$ cd Test
$ mkdir a
$ mkdir b
$ mkdir c
$ cd a
$ mkdir .git
$ cd ..
$ cd b
$ touch .git
$ cd ..
$ cd c
$ mkdir c1
$ mkdir c2
$ cd..
$ find . -type d \( \( ! -name . -exec [ -e {}/.git ] \; -prune \) -o \( \( \
 -name .git\
 -o -name .vscode\
 -o -name node_modules\
 -o -name Image\
 -o -name Rendered\
 -o -name iNotebook\
 -o -name GeneratedTest\
 -o -name GeneratedOutput\
  \) -prune \) -o -print \) | sort 
Run Code Online (Sandbox Code Playgroud)

预期成绩

.
./a
./c
./c/c1
./c/c2
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 6

find操作也是测试,因此您可以使用-exec以下方法添加测试:

find . \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print
Run Code Online (Sandbox Code Playgroud)

这适用于三组操作:

  • -exec [ -f {}/.git ] \; -prune 修剪包含名为的文件的目录 .git
  • -name .git -prune修剪命名的目录.git(因此该命令不会在.git存储库的主目录中搜索)
  • -print 打印上面没有捕获的任何内容。

要仅匹配目录,请-type d-print, 或之前添加,或(以节省处理文件的时间):

find . -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)
Run Code Online (Sandbox Code Playgroud)

.通过更改find启动路径,在 以外的目录上运行它时,这也有效:

find /some/other/path -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)
Run Code Online (Sandbox Code Playgroud)