Bash

對目錄樹中的所有文件執行命令並將輸出放入變數中

  • April 5, 2019

我想執行這個 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

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