Find

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

  • September 15, 2018

我試圖通過排除所有包含.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 

預期成績

.
./a
./c
./c/c1
./c/c2

find操作也是測試,因此您可以使用以下命令添加測試-exec

find . \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print

這適用於三組操作:

  • -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 \)

.通過更改find啟動路徑,在除 之外的目錄上執行它時,這也有效:

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

引用自:https://unix.stackexchange.com/questions/468734