bash 脚本将“cut”/“find”的输出重定向到“scp”并应用一些转换

bash 脚本将“cut”/“find”的输出重定向到“scp”并应用一些转换

我需要将cut/的输出重定向find到,scp并在其间应用文件名转换。

背景:

我正在使用clearcase进行版本控制。我有一个分支feature/Main.我想要将分支scp中的所有文件feature及其原始版本转移/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/命令的输出输入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@@/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

这假定您的文件名是每行一个,没有换行符之类的尴尬字符。

相关内容