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

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

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

背景:

バージョン管理には透明ケースを使用しています。featureブランチのすべてのファイルと元のバージョンを別のコンピュータに転送し/Mainたいと思います。scpfeature/Main

私はポイントから変更されたファイルを一覧表示するコマンドを知っており、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/ commandの出力を編集する前にcut編集してください。scp

何も動作しない場合は、分岐に変更することができますが、/Main/latestより良い方法を見つけようとします。

どんなアドバイスでも役に立ちます。

修正する

filefinderニックネーム:

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

ありがとうございます!

答え1

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

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

こんな名前のファイルをたくさんコピーしていると少し心配になります。

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

名前付きターゲットが作成されます。したがって、ターゲットは次のように維持する必要があるとMain仮定します。a.c@@/Maina.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
    ' _ {} +
}

コマンドが正しいと思われる場合は削除してくださいechoscp


filefinderだから思ったより簡単ではないようです。それにもかかわらず、私たちはまだ次のようなものを使用できます

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

これは、ファイル名が改行などの厄介な文字なしで1行に1つずつあると仮定します。

関連情報