将输入连接到带有输出的svn list命令,然后将其传递给grep

时间:2014-10-29 11:00:05

标签: unix svn grep xargs

我目前有以下shell命令,它只能部分工作:

svn list $myrepo/libs/ | 
xargs -P 10 -L 1 -I {} echo $myrepo/libs/ {} trunk |
sed 's/ //g' |
xargs -P 20 -L 1 svn list --depth infinity |
grep .xlsx

其中$myrepo对应于svn服务器地址。

libs文件夹包含许多子文件夹(目前大约30个,但最终达到100个),每个子文件夹包含许多标签,分支和一个主干。我希望获得仅包含在每个子文件夹的trunk文件夹中的xlsx文件列表。上面的命令工作正常,但它只返回$ myrepo / libs / subfolder / trunk /的相对路径,所以我得到了回复:

1/2/3 / file.xlsx

由于我可能需要搜索的文件数量可能很大,因此我使用xargs -P在两个并行步骤中执行它(我没有,也不能使用parallels)。它也试图在一个命令中执行此操作,因此它可以在php / perl / etc中使用。并避免多个系统调用。

我想要做的是将输入连接到命令的这一部分:

xargs -P 20 -L 1 svn list --depth infinity

使用它的输出,给出以下内容:

$myrepo/libs/subfolder/trunk/1/2/3/file.xlsx

然后将其传递给grep以查找xlsx文件。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

如果我能够正确地理解你的意图,那么这样的事情可能对你有用。

svn list "$myrepo/libs/" |
xargs -P 20 -n 1 sh -c 'svn list -R "$0/trunk/$1" |
    sed -n "s%.*\.xlsx$%$0/trunk/$1/&%p"' "$myrepo"

简单地说,我们对内部svn list的输出进行后处理,以过滤为.xslx个文件,并同时恢复完整的SVN路径。这样,处理发生在repo路径仍然已知的地方。

我们通过将"$myrepo" "$0"作为sh传递给下属export来解决问题,因此我们不必svn list这个变量。外部$1的输入为{{1}}。

(我可以访问的repos具有稍微不同的布局,因此可能在某处出现复制/粘贴错误。)