首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找包含特定文件的排除路径

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

Unix & Linux用户
提问于 2018-09-13 08:01:37
回答 4查看 2K关注 0票数 2

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

解释:

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

测试用例

代码语言:javascript
运行
复制
$ 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 

预期结果

代码语言:javascript
运行
复制
.
./a
./c
./c/c1
./c/c2
EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2018-09-13 09:08:32

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

代码语言:javascript
运行
复制
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,或者(为了节省处理文件的时间):

代码语言:javascript
运行
复制
find . -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)

.以外的目录上运行此操作时,还可以通过更改find启动路径来实现:

代码语言:javascript
运行
复制
find /some/other/path -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name .git -prune \) -o -print \)
票数 6
EN

Unix & Linux用户

发布于 2018-09-13 08:31:57

我们可以创建一个递归的find

将下列行添加到脚本文件中:

代码语言:javascript
运行
复制
#!/bin/bash
if [ ! -f "$1"/.git ]; then
    echo "$1"
    find "$1" -mindepth 1 -type d -prune -exec "$0" {} \;
fi

我将文件命名为findifnotgit,但这并不重要。然后使其可执行

代码语言:javascript
运行
复制
chmod u+x findifnotgit

然后使用要作为参数运行的路径运行它:

代码语言:javascript
运行
复制
./findifnotgit .

-目前的.

代码语言:javascript
运行
复制
./findifnotgit /path/to/search/

解释

  • 只有在当前文件夹( if [ ! -f "$1"/.git ]; then ... fi )中没有.git文件时,才能运行以下命令
  • 我们需要-mindepth 1选项来让find找到我们开始使用的文件夹,该文件夹将创建一个不确定的循环。
  • 我们需要-prune,这样查找就不会下降到目录中。我们将在-exec中自己做这件事。
  • -exec "$0" {}将使用查找调用相同的脚本$0
票数 3
EN

Unix & Linux用户

发布于 2018-09-13 08:33:31

有点脏的脚本,但是这会发现所有目录中都不包含.git文件:

代码语言:javascript
运行
复制
#!/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

edit2:

是的,那是错的,我很抱歉。编辑好了,所以现在可以用了。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/468734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档