目前,我们的备份脚本每晚在每个存储库上显式运行svnadmin hotcopy。我们的存储库都存储在父目录下(/ usr / local / svn / repos) 我们的备份脚本在该目录下的每个repos都有一行代码: svnadmin hotcopy / usr / local / svn / repos / myrepo1 / usr / local / backup / myrepo1
我不希望为每个我们带来的新repo手动添加新行,而是希望使用find命令为/usr/local/svn/repos.//下找到的每个目录运行svnadmin hotcopy。 p>
到目前为止,我已经:
find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \;
,为了简单起见,我用“echo”代替“svnadmin hotcopy”。 其输出是:
/usr/local/backup/usr/local/svn/repos/ure
/usr/local/backup/usr/local/svn/repos/cheetah
/usr/local/backup/usr/local/svn/repos/casemgt
/usr/local/backup/usr/local/svn/repos/royalliver
/usr/local/backup/usr/local/svn/repos/ure_andras
/usr/local/backup/usr/local/svn/repos/profserv
/usr/local/backup/usr/local/svn/repos/frontoffice
/usr/local/backup/usr/local/svn/repos/ure.orig
/usr/local/backup/usr/local/svn/repos/projectcommon
/usr/local/backup/usr/local/svn/repos/playground
/usr/local/backup/usr/local/svn/repos/casegen
问题是完整路径包含在{}中。我只需要传递给-exec
的目录名的最后一个元素我想要的输出:
/usr/local/backup/ure
/usr/local/backup/cheetah
/usr/local/backup/casemgt
/usr/local/backup/royalliver
/usr/local/backup/ure_andras
/usr/local/backup/profserv
/usr/local/backup/frontoffice
/usr/local/backup/ure.orig
/usr/local/backup/projectcommon
/usr/local/backup/playground
/usr/local/backup/casegen
我几乎陷入困境。有人可以帮我从这里出去吗? 提前致谢, 戴夫
答案 0 :(得分:1)
你走在正确的轨道上。试试这个:
find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -printf "%f\0" | xargs -0 -I{} echo svnadmin hotcopy /usr/local/svn/repos/\{\} /usr/local/backup/\{\}
%f
与basename
类似,而xargs上的null加上-0
可确保带有空格等的名称成功传递。
只需移除echo
并进行您可能需要的任何调整,它应该可以解决问题。
答案 1 :(得分:0)
在最后放一个剪切命令
find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"
答案 2 :(得分:0)
如何添加sed
过滤器切割中间部分?
sed 's/usr.local.svn.repos.//g'
像这样添加
find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} ";" | sed 's/usr.local.svn.repos.//g'
答案 3 :(得分:-1)
ls -al /usr/local/svn/repos/ |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo /usr/local/svn/repos/zzyggy
它有点长,但它可以解决问题。当有很多其他shell命令时,你不需要使用find做任何事情,虽然如果我必须编写这种脚本,我会用Python做这个并留下shell用于交互式工作。
ls -al
列出命名目录中具有属性
grep '^d'
选择以d开头的行,即目录
sed
剥离实际目录名左侧的所有字符。您可能需要添加或删除一些点
xargs
获取目录名称列表并一次发出一个目录名称。我在执行的命令中指定了zzyggy作为替换名称,但是您可以选择自己喜欢的名称。当然,您可以使用svnadmin命令替换echo。
如果它是在shell脚本中你应该真的这样做
SVNDIRNAME="/usr/local/svn/repos"
ls -al $SVNDIRNAME |grep '^d' |sed s/^...............................................................//" |xargs -L 1 -I zzyggy echo $SVNDIRNAME/zzyggy
但我决定以错误和正确的方式来解释这一点。我打算用一些shell标签标记这个,但我仍然认为Python脚本是解决21世纪这类问题的一种优秀方法。