web-dev-qa-db-ja.com

いくつかの変換を適用して、「cut」/「find」の出力を「scp」にリダイレクトするbashスクリプト

cut/findの出力をscpにリダイレクトし、その間にファイル名変換を適用する必要があります。

背景:

バージョン管理にクリアケースを使用しています。 _/Main_から分岐したブランチfeatureがあります。 scpブランチからのすべてのファイルと_/Main_にある元のバージョンを他のマシンにfeatureしたいと思います。

featureブランチで変更したファイルを一覧表示するコマンドを知っていますが、元のコピーも取得できます。

これは私が試したものです:

ブランチからファイルを一覧表示するためのエイリアスfilefinderを作成しました。

findを使用して、featureブランチからすべてのファイルを検索します。

_$ filefinder `feature` | cut -d '/' -f 2 -

a.c

b.c

c.h

d.h
_

だから、私が試してみると、例えば.

_$ scp $(filefinder KERN_414_A64 | cut -d '/' -f 2) test@ip:/path/
_

scpブランチ上のすべてのファイルをfeatureできます。

要件:

ファイルの_/main/latest_バージョンを取得するため。ファイルの名前を次のように変更する必要があります

_a.c@@/Main

b.c@@/Main

c.h@@/Main
_

次に、scpこれらのファイル。したがって、基本的には、find/cutコマンドの出力を編集してから、scpにフィードします。

何も機能しない場合は、ブランチを_/Main/latest_に変更できますが、より良い方法を見つけようとしています。

どんなポインタも役に立ちます。

更新

filefinderエイリアス:

cleartool find . -type f -branch "brtype($1)" -print | awk -F"@" '{print $1}'

ありがとう!

1
HarshaD

filefinderの具体的な定義がない場合は、次のようなものと想定します(ただし、更新については以下を参照してください)。

filefinder() { find "$1" -type f; }

このような名前のファイルを多数コピーしている場合は少し心配です

a.c@@/Main
b.c@@/Main
c.h@@/Main

最終的には、ターゲット上にMainという1つのファイルが作成されます。したがって、a.c@@/Mainの場合、ターゲットはa.cのままであると想定しました。

これで、filefinderを使用する代わりに、1回の操作でファイルをコピーできます。 filefinder(上記)のようにパラメーター化できるように、このソリューションを構築しました。

filecopier() {
    find "$1" -type f -exec bash -c '
        for file in "$@"
        do
            file="${file#*/}"
            echo scp -p "${file}@@/Main" test@ip:"/path/${file##*/}"
        done
    ' _ {} +
}

コマンドが正しいことを確認したら、echoからscpを削除します。


したがって、filefinderは私が推測したほど単純ではないようです。それでも、同様のアプローチを使用できます

filefinder ... |
    while IFS= read -r file
    do
        echo scp -p "${file}@@/Main" test@ip:"/path/${file##*/}"
    done

これは、ファイル名が1行に1つであり、改行などの厄介な文字がないことを前提としています。

0
roaima