Bash
對目錄樹中的所有文件執行命令並將輸出放入變數中
我想執行這個 bash 命令:
#!/bin/bash rep="*" for f in `ls -R`$rep; do d='git log '$f'| wc -l' c=$d echo $c done
如何
git log myFile | wc -l
從 bash 執行命令?ps:此命令將返回一個數字:
git log myFile | wc -l
如果要執行命令並獲取輸出,請使用以下行
d=`git 日誌`
在您的腳本中,您必須更改兩兩件事。我在下面有正確的腳本
#!/bin/bash 代表=“*” 對於 `ls -R $rep` 中的 f;做 d=`git 日誌 $f| 廁所-l` c=$d 迴聲 $c 完畢
編輯:最初的更正是將引號更改為反引號以使輸出達到 d 變數。此外,$rep 應該在 ls 的反引號內,否則它將在最後處理的文件名末尾添加 *。
我已經在呼叫 find 的 bash 腳本中回答了您的其他問題 Syntax error,因此我不會重複我在答案中已經寫過的內容。
不要解析
ls
. 您無需執行ls
即可列舉目錄中的文件。find
如果您需要遞歸到子目錄,請使用。要獲得 的輸出
wc -l
,請在命令替換中使用它:$(git log "$f" | wc -l)
請注意,您需要在變數名周圍加上雙引號。始終在變數和命令替換周圍使用雙引號:
"$foo"
,"$(foo)"
. 雙引號會關閉 shell 對變數值或命令輸出的進一步處理:沒有引號,結果將被拆分為被解釋為文件萬用字元模式的單詞。使用單引號,$
符號不會被特殊處理,所以git
會看到$f
而不是值。find . -type f -exec sh -c ' for x in "$@"; do c=$(git log "$f" | wc -l) done ' _ {} +
使用
-exec … {} +
而不是-exec … {} \;
允許每個大批量文件只呼叫一次中間shell,這有點快。由於 bash ≥4,不需要使用
find
,可以使用**
語法遞歸到子目錄中。shopt -s globstar for x in **/*; do [ -f "$x" ] || continue # skip directories and other non-regular files git log "$x" | wc -l done