ディレクトリツリーのすべてのファイルに対してコマンドを実行し、出力を変数に入れます。

ディレクトリツリーのすべてのファイルに対してコマンドを実行し、出力を変数に入れます。

この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 -lBashでコマンドを実行するには?

ps:このコマンドは数値を返します。git log myFile | wc -l

答え1

コマンドを実行して出力を取得するには、次の行を使用します。

d = `gitログ`

スクリプトで2つを変更する必要があります。以下に正しいスクリプトがあります

#!/bin/bash
代表者="*"

for f in `ls -R $rep`;
d=`git log$f|トイレ-l`
c=$d
エコ$c
完璧

編集:元の修正は、出力がd変数に移動するように引用符をバックティックに変更することでした。また、$ repはlsのバックティック内になければなりません。それ以外の場合は、最後に処理されたファイル名の末尾に*が追加されます。

答え2

私はすでにあなたの他の質問に答えましたfindを呼び出すbashスクリプトの構文エラーだから、すでに書いた内容を繰り返しません。私の答えはそこにあります

出力を解析しません。lslsディレクトリ内のファイルを列挙するために実行する必要はありません。findサブディレクトリに再帰的に移動する必要がある場合。

出力を取得するには、wc -lコマンドの置換に使用します。$(git log "$f" | wc -l)

変数名は二重引用符で囲む必要があります。変数とコマンドの置換には常に二重引用符を使用してください"$foo""$(foo)"二重引用符は、変数値またはコマンド出力のシェルによる追加処理をオフにします。引用符がない場合、結果はファイルワイルドカードパターンとして解釈される単語に分割されます。一重引用符を使用すると、$シンボルは特に処理されないため、値の代わりにgit表示されます。$f

find . -type f -exec sh -c '
  for x in "$@"; do
    c=$(git log "$f" | wc -l)
  done
' _ {} +

-exec … {} +代わりに、-exec … {} \;中間シェルを一括ファイルごとに一度だけ呼び出すことができ、少し高速です。

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

答え3

私が知っている限り、コマンドは次のとおりです。

     git log

すべての改訂履歴が表示されます。これが本当なら、myfileというファイルにコンテンツを保存しようとした後、ファイルの行数を数えようとしているようです。

これが必要な場合は、まず次のように履歴を保存できます。

     git log>myFile.txt

wc -lを使用して行数を見つけて、nOfLines.txtというファイルに保存する必要があります。

だからあなたはこれをしなければなりません:

    wc -l<myFile.txt>nOfLines.txt

このファイルの内容は gitVar という変数に保存されます。

     gitVar=$(cat nOfLines.txt)

次のコマンドを使用して、正しく機能していることを確認できます。

     echo "$gitVar"

「myCommand.sh」というスクリプトにすべてをまとめて、chmod a + xを使用して権限を付与し、コマンドのように端末でスクリプトを実行します。

答え4

私はあなたがしたいと思います:

#!/bin/bash
rep="*"

for f in `ls -R`$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done

gitコマンドの周りには一重引用符の代わりに二重引用符があります。

より小さな解決策は、次のものを使用することです。

echo `git log "$f"| wc -l`

関連情報