将所有目录列出到git目录的简单方法

时间:2016-10-04 07:48:09

标签: bash

我在${HOME}/projects/中的项目采用层次结构,如下所示:

${HOME}/projects/
 - custumer1/
   - c1_git_repo1
     - subdir1
     - ...
   - c1_git_repo2
     - ...
 - customer2/
   - c2_project1/
     - c2_p1_git_repo1
       - ...
     - c2_p1_git_repo2
       - ...
 ...

我想用{$HOME}/projects以下的所有目录填充我的CDPATH直到git repos。所以在上面的例子中,这将是:

CDPATH=${HOME}/projects/customer1:${HOME}/projects/customer1/c1_git_repo1:${HOME}/projects/customer1/c1_git_repo2:${HOME}/projects/customer2:${HOME}/projects/customer2/c2_project1:${HOME}/projects/customer2/c2_project1/c2_p1_git_repo1:${HOME}/projects/customer2/c2_project1/c2_p1_git_repo2

所以我需要找到{$HOME}/projects/以下的所有目录,但要在任何包含“.git”文件夹的目录中停止。

是否有一些可以为我列出目录的cmd工具?

2 个答案:

答案 0 :(得分:1)

以下内容从$HOME/projects获取除.git以外的所有目录以及.git目录的内容。

paths=$(
find "$HOME/projects/" -mindepth 2 -type d -not -ipath '*/.git*' \
  | while read d
do
  builtin printf %q: "$d"
done
)
echo $paths

示例输出

/home/user/projects/dir\ with\ spaces:/home/user/projects/prj2

while循环中,我们转义目录路径并通过bulit-int printf函数附加冒号。

结果存储在paths变量中。

答案 1 :(得分:0)

我会用这样的东西来找到目录:

find "$HOME/projects" -type d -execdir test -d {}/.git \; -print -prune

只要有.git,就会停止查找,因此它不会进入repos寻找子模块,也不会实际下降到任何.git目录中。

接下来,您希望在数组中获取该命令的结果(我将数组命名为repos)。如果您使用的是bash版本4+,最简单的方法是mapfile,它不会在路径名中的任何空格上分割:

mapfile -t repos < <(
 find "$HOME/projects" -type d -execdir test -d {}/.git \; -print -prune)

如果您使用/ bin / bash在Mac上,则表示您没有该选项,因此您可以使用read更改IFS-d选项达到同样的结果:

IFS=$'\n' read -r -d '' -a repos < <(
  find "$HOME/projects" -type d -execdir test -d {}/.git \; -print -prune)

无论哪种方式,一旦在repos数组中有路径名,就可以像这样分配CDPATH:

CDPATH=${repos[0]}$(printf ":%s" "${repos[@]:1}"})