我试图递归地查找文件夹中的所有目录,同时排除包含.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发布于 2018-09-13 09:08:32
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 \)发布于 2018-09-13 08:31:57
我们可以创建一个递归的find:
将下列行添加到脚本文件中:
#!/bin/bash
if [ ! -f "$1"/.git ]; then
echo "$1"
find "$1" -mindepth 1 -type d -prune -exec "$0" {} \;
fi我将文件命名为findifnotgit,但这并不重要。然后使其可执行
chmod u+x findifnotgit然后使用要作为参数运行的路径运行它:
./findifnotgit .-目前的.
或
./findifnotgit /path/to/search/解释
if [ ! -f "$1"/.git ]; then ... fi )中没有.git文件时,才能运行以下命令-mindepth 1选项来让find找到我们开始使用的文件夹,该文件夹将创建一个不确定的循环。-prune,这样查找就不会下降到目录中。我们将在-exec中自己做这件事。-exec "$0" {}将使用查找调用相同的脚本$0。发布于 2018-09-13 08:33:31
有点脏的脚本,但是这会发现所有目录中都不包含.git文件:
#!/bin/bash
# find dirs that contain *.git files and store in array
exclude_dirs=($(find . -type f -iname ".git" | xargs -i dirname {}))
# set up the base command
command="find . -type d"
# loop over each element in array by index
for i in $(seq 0 $(expr ${#exclude_dirs[@]} - 1)); do
command="${command} -not -path ${exclude_dirs[$i]}"
done
# run the find
eval ${command}修正语法错误并将*.git更新为.git
是的,那是错的,我很抱歉。编辑好了,所以现在可以用了。
https://unix.stackexchange.com/questions/468734
复制相似问题