Bash

列印目前目錄中不包含 .git 的所有子目錄

  • June 18, 2019

我正在嘗試編寫一個 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)

引用自:https://unix.stackexchange.com/questions/525534