.git
私たちは空のgitリポジトリにディレクトリだけが含まれていることを知っています。
私はコンピュータ上の空のgitリポジトリをすべて探したいと思います。
私はこのプロセスについて次のように考えました。
- 指定されたすべてのディレクトリを検索
.git
- 内部にある場合は除外します。
Trash
- 他のリポジトリがあなたのリポジトリではない場合は除外します(一部のサードパーティ製アプリケーションもgitリポジトリをインポートします)。
- ループを繰り返す
- 各リポジトリの親ディレクトリの最上位ファイルとフォルダの数を計算します。
- 数が0(除外
.git
)または1(含む.git
)の場合、リポジトリは空です。echo
それ。
これは私のスクリプトです。
find / -type d -name .git 2>/dev/null |
{
while read gitFolder; do
if [[ $gitFolder == *"/Temp/"* ]]; then
continue;
fi
if [[ $gitFolder == *"/Trash/"* ]]; then
continue;
fi
if [[ $gitFolder == *"/opt/"* ]]; then
continue;
fi
parent=$(dirname $gitFolder);
echo "";
if [ $(ls $parent -A | wc -l ) != 1 ]; then
echo $parent
fi
done
}
しかし、これは期待どおりに機能しませんでした。すべてのリポジトリが一覧表示されます。これは、比較セクションにエラーがありますが見つかりません。私は何が間違っていましたか?
また、これが最善のアプローチではないかもしれないと思います。より良くする方法についてのアイデアはありますか?
ベストアンサー1
これは比較がうまくいかない理由を説明しませんが、出力を繰り返すことなくfind
これらすべてを直接実行できます(find
サポートしている場合)。-execdir
find / -type d \( \( \( -name Temp -o -name Trash -o -name opt \) -prune \) \
-o \( -name .git -execdir sh -c '[ "$(ls -A)" = ".git" ] && pwd' \; \) \)
これはすべてのディレクトリ、prunesなどを探します。Temp
したがって、サブディレクトリもナビゲートしません。というディレクトリが見つかったら、.git
親ディレクトリでテストを実行し、.git
そのファイルが存在する唯一のファイルであることを確認し、そうであればpwd
現在のディレクトリを印刷します。