我在${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工具?
答案 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}"})