2016-10-04 26 views
1

私は、階層構造で${HOME}/projects/にこのような何か私のプロジェクトを持っている:私はgitのまで{$HOME}/projects以下のすべてのディレクトリと私CDPATHを埋めたい簡単な方法

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

をレポ。したがって、この上記の例では、次のようになります。

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

「$ {HOME}」を見つけてください。-not -ipath * /。git * ''。 – RedX

+0

mmg、それは動作していないようです。私はそれが単に ".git"ディレクトリにファイルをリストしていないと思うが、.gitディレクトリの隣のものも削除したい。 – Nathan

+0

次はどういう意味ですか?ですから、 'folder/with/.git'を持っているなら' folder/with'を追加したくないでしょうか?または単に 'folder/with/other_folder'ですか? – RedX

答えて

1

.git.gitディレクトリの内容を除き、次のディレクトリはすべて$HOME/projectsから取得します。我々は、ディレクトリパスを逃れ、エージェントbulit-INT printf機能によってコロンを付加whileループにおいて

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 

結果はpaths変数に格納されます。

+0

しかし、私は適当なリポジトリだけを望んでいない、 '' '{HOME}/projects /' ''の下のすべてのディレクトリを、ディレクトリ。 – Nathan

0

私は、ディレクトリを見つけるために、このようなものを使用します。

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

.gitがありますいつでもこれは検索を停止しますので、それはサブモジュールを探してリポジトリに降りないであろう、またそれが実際に降ります.gitディレクトリのいずれかです。

次に、そのコマンドの結果を配列(私は配列reposと名付けました)で取得します。

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

あなたは、Mac使用/ binに/ bashのにしている場合:あなたは、bashのバージョン4+を使用している場合は、それを行うための最も簡単な方法は、パス名内の任意のスペースに分割されませんmapfile、ありますあなたはrepos配列内のパス名を持っていたら

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

いずれかの方法、次のことができます。あなたが同じ結果を達成するために変更されIFS-dオプションでreadを使用することができますので、あなたは、そのオプションを持っていません次のようにCDPATHを割り当てます。

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