我目前有以下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文件。
感谢您提供的任何帮助。
答案 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具有稍微不同的布局,因此可能在某处出现复制/粘贴错误。)