Bash

bash 腳本將“cut”/“find”的輸出重定向到“scp”,並應用了一些轉換

  • April 29, 2020

我需要將cut/的輸出重定向findscp在兩者之間應用文件名轉換。

背景:

我正在使用 clearcase 進行版本控制。我的分支feature/Main. 我想將分支中的scp所有文件feature及其原始版本/Main轉移到其他機器上。

我知道列出我在分支上更改的文件的命令feature,我也可以獲得原始副本。

這是我嘗試過的:

我創建了一個別名filefinder來列出分支中的文件。

它用於findfeature分支中查找所有文件。

$ 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}'

謝謝!

在沒有具體定義的情況下,filefinder我將假設它是這樣的(但請參閱下面的更新)

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

我有點擔心,如果您要複製許多這樣命名的文件

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

你最終會在目標上得到一個名為Main. 因此,我假設a.c@@/Main目標應該保持為a.c

現在,filefinder您可以在一次操作中復製文件,而不是使用。我已經建構了這個解決方案,以便可以像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

這假定您的文件名是每行一個,沒有像換行這樣的尷尬字元。

引用自:https://unix.stackexchange.com/questions/583342