Bash
列印目前目錄中不包含 .git 的所有子目錄
我正在嘗試編寫一個 bash 行,它將查看我目前文件夾中的所有子目錄,並告訴我是否有任何不包含“.git”。偽:
for subdir in currentdir if .git does not exist print subdir
這是我正在嘗試的單行程式碼,它不起作用並且似乎列印了所有子目錄:
find . -maxdepth 1 -type d -execdir $SHELL -c '[ ! -d ".git" ] && echo "not git repo:" {}' $SHELL -c '{}' ';'
我找到了一些解決方案,可以讓我列印所有具有 .git 的子目錄,比如這個——我正試圖做相反的事情。
我究竟做錯了什麼?這可能嗎?
首先,該
-execdir
命令看起來很奇怪(2x$SHELL -c
?):$SHELL -c '[ ! -d ".git" ] && echo "not git repo:" {}' $SHELL -c '{}' ';'
此外,
-execdir
在包含匹配實體的目錄中執行命令(因此它現在正在檢查的目錄的父目錄),它.
適用於所有子目錄。測試在錯誤的目錄中執行。和:
- 您不應該
{}
在exec
/-execdir
命令中重用。- 沒有理由使用
$SHELL
. 那是使用者的登錄shell,對於腳本等的使用沒有什麼特別的意義。直接使用sh
,bash
或者ksh
如果這些是您選擇的外殼,請直接使用。這可能有效:
find . -maxdepth 1 -type d -exec sh -c '! [ -d "$1/.git" ] && echo "not git repo: $1"' _ {} \;
該
-exec
命令檢查.git
傳入的參數中是否存在 ,依次是每個子目錄。您可能還想使用-mindepth 1
排除目前目錄:find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '! [ -d "$1/.git" ] && echo "not git repo: $1"' _ {} \;
或者,僅使用 bash,啟用
dotglob
匹配隱藏目錄:(shopt -s dotglob; for d in ./*/; do [[ -d $d/.git ]] || echo "not git repo: $d"; done)