私はLinuxでbashを学んでいます。 「ファイルから読みながらループ」のスクリプトを見つけて、以下のように修正しました。すべてのgitリポジトリを含むリストファイルを読み込もうとしており、すべてのgitリポジトリを繰り返してすべてgit status
実行しようとしています。彼ら:
while read line;
do echo $line;
cd $line;
git status;
done < repo.list
この部分はうまく機能し、標準出力で各リポジトリの状態を表示できますが、出力を別のファイルに書き込もうとすると機能しません。
while read line;
do echo $line;
cd $line;
git status;
done < repo.list
> status.txt
git status
すべての出力を統合してファイルに書き込むにはどうすればよいですか?ありがとうございます!
答え1
新しい行にリダイレクトするときは、空のコマンドとして機能してこの問題を解決してくださいdone
。
while IFS= read -r line;
do echo "$line"
(cd "$line"; git status)
done < repo.list > status.txt
また、見ることができますIFSについて学ぶそして「IFS=read-r-line」を理解する影響の微妙さに関する情報に関連する問題をリンクしますread
。
cd
と一緒にサブシェルを使用するgit status
ことは、ディレクトリを変更してもループの後続の反復やwhile
。
答え2
私はそれをグーグルし、これがmydir -name .git -type dであることを発見しました。
次のようにできます。
find . -name '.git' -type d -print -execdir git status \;
その後、名前付きディレクトリを探し、.git
各ディレクトリに対してそのパスを印刷してから、含まれているディレクトリに移動してgit status
そこから実行します。 (find -exec
コマンドは元のディレクトリで実行され、-execdir
一致するファイル/ディレクトリの場所に移動します。)
次のように出力されます。
./this-stuff/.git
On branch master
Your branch is up to date with 'origin/master'.
そしてこれを後処理するには、より多くの技術が必要です.git
。 (例えば-exec sh -c 'echo "${1%.git}"' sh {} \;
。-print
)
一般的に言って、find
あなたが何かをしたいなら、それはうまくいくかもしれませんみんなファイルのメタデータで明確に表示される特定の条件に一致する特定のサブツリーのファイル/ディレクトリ。ただし、既存のリストがある場合、これを処理する最善の方法はシェルループです。
答え3
あなたの質問は単純なタイプミスです。スティーブンすでに。
git status
ファイルの行で指定された各ディレクトリでタスクを実行するには、次のようにすることもxargs
できます。
xargs -I {} git -C {} status <repo.list >status.txt
これgit -C {} status
にはファイルのすべての行が必要ですrepo.list
。{}
ファイルから読み取られた行に置き換えられ、オプションを使用すると、ユーティリティは現在のディレクトリではなくサブコマンドの代替ディレクトリを使用します-C
。git
status
各呼び出しの前にストレージパスを出力するには、次のスクリプトを呼び出しgit status
ます。sh -c
xargs -I {} sh -c 'printf "REPOSITORY: %s\n" "$1"; git -C "$1" status' sh {} <repo.list >status.txt
スクリプト内では、sh -c
リポジトリパス名がとして与えられます"$1"
。