bashでファイルをループし、ディレクトリ名の先頭にのフィルタリング

ヤニック・フォースター:

私はbashのスクリプトには本当に新しいだと私はSubversionのフックで使用するbashスクリプトを記述しようとしています。

目標はcomittedたJavaプロジェクトのリストを取得することです(私はそれから変更ログを作成し、アプリケーション内でそれを表示できるように)、その後、他のいくつかの情報は、私がしたことsvnlookを使用して収集に沿ってファイルにそのリストを作成しますすでに働きました。

転覆自体は本当に私は日食にコミットし、代わりのディレクトリで動作することをプロジェクトのために気にしないので、私はコミットに含めたフルパスで一人ひとりのファイルを吐き出すコマンド「に変更svnlook」を使用する必要があります。

ここではどのような「svnlook変更」を返すの例を示します。

U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java                                                                                                                                                                                                                                                                                                                                                                     
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java                                                                                                                                                                                                                                                                                                                                                            
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java

彼らは常に、それらの文字やIで始まりますので、今、私は、このディレクトリ構造は、常に同じであることを保証できないので、私は何をしたいのか、「PRJ」と「LIB」のためにフィルタリングすることによって、Javaプロジェクトの名前を見つけることですこれは変更されませんを確認することができます。

それでは、私は、スクリプトの中でやろうとしています:

ステップ1:ファイルに「変更svnlook」の出力を置きます:

tempfile=/data/svn/scratch.txt
input=/data/svn/scratch2.txt
touch $tempfile
touch $input

$SVNLOOK changed -r "$REVISION" "$REPOS" >> $input 

これは動作します。

ステップ2:ファイルのすべての行を超える反復、パスに「LIB」または「PRJ」を探して、プロジェクトを表し部分文字列を取得します。ファイルにこれらを記述します。今の私はせいぜい9つのディレクトリが存在しないと仮定していると私はそれぞれを見てパスを介して10回ループしています:

for i in {1..10}
do
        cat $input | cut -d "/" -f $i | grep -i -s -e PRJ -e LIB | tr [:lower:]äöü [:upper:]ÄÖÜ >> $tempfile
done

これは、スクリプトでは動作しません。/data/svn/scratch.txtのファイルは常に空です。私は、コマンドラインからコマンドを実行して$入力を交換し、$ Iと、それはあまりにも、動作し、次のコマンドのすべての作業。

ステップ3:他のすべての変数を設定します。私は重複を除外し、それらを区切るためにコンマを入れて、一時ファイルを反復処理します:

DATE=$(date '+%d-%m-%Y')
REVISION=$($SVNLOOK youngest "$REPOS") 
CHANGEDPRJ=$(cat $tempfile | sort -u |  xargs | sed -e 's/ /, /g')
COMMENT=$($SVNLOOK log -t "$TXN" "$REPOS")

ステップ4:出力、私はそれをすべて保存したいしたファイルに他のものに沿って、この変数:

echo "$DATE" , "$REVISION" , "$CHANGEDPRJ" , "$COMMENT" >> /data/svn/commit.log

だから、今、私は取得しています:

17-02-2020、571、時代遅れのコメントのクリーンアップ

の代わりに:

17-02-2020、571、LIB1、LIB2、PRJ1、古くなったコメントのクリーンアップ

私はかなり確信してこの作業を取得するために非常に明白かつ簡単な解決策があるんだけど、今日は非常に最初の時間のためのbashスクリプトだと私は私がやっているかを調べるために、正しいことのためにgoogleのように見えることはできません間違った....誰かが素晴らしいだろう正しい方向に私を指すことができれば!

KamilCuk:

以下:

cat <<EOF |
U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java     
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java
EOF
# remove the U<space><space>
sed 's/^U  //' |
# replace `/` with a newline
tr '/' '\n' |
# grep only lines with PRJ and LIB
grep -e 'PRJ\|LIB' |
# sort unique
sort -u |
# join elements with a comma
paste -sd,

出力:

LIB1,LIB2,PRJ1

あなたが望んでいるのは:

"$SVNLOOK" changed -r "$REVISION" "$REPOS" |
sed 's/^U  //' | tr '/' '\n' | grep -e 'PRJ\|LIB' | sort -u | paste -sd,

注:変数の展開を引用することを忘れないでください。しないでくださいtouch $tempfileくださいtouch "$tempfile"

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=14201&siteId=1
おすすめ