2016-10-04 55 views
1

我有我的項目${HOME}/projects/在一個層次結構,這樣的事情:簡單的方式

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

我想,以填補我的CDPATH下面{$HOME}/projects所有目錄到混帳回購。所以在這個上面的例子是:

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

嘗試'find「$ {HOME}」-not -ipath'* /。git *''。 – RedX

+0

mmg,這似乎不起作用。我認爲它只是沒有列出「.git」目錄中的文件,但我也想刪除.git目錄旁邊的任何內容。 – Nathan

+0

接下來是什麼意思?所以如果你有'folder/with/.git'你也不想'folder/with'被添加?或者只是'文件夾/ with/other_folder'? – RedX

回答

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循環中,我們逸出目錄路徑和通過儲存卡-INT printf功能的手段附加一個冒號。

結果存儲在paths變量中。

+0

但我不想只適合倉庫,我想所有目錄下'''{HOME}/projects /''',但不低於任何git目錄。 – Nathan

0

我會用這樣的事情,找到目錄:

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

這會停止,只要有一個.git查找,這樣就不會陷入尋找子模塊的回購協議,也將真正陷入任何.git目錄本身。

接下來,您想要在數組中獲得該命令的結果(我將其命名爲數組repos)。如果你正在使用bash 4.0以上的版本,這樣做最簡單的方法是mapfile,不會對任何空格分割路徑名中:

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

如果你是一個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}"})