目前,我们的备份脚本每晚在每个存储库上显式运行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{} \;

,我在用'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

我几乎陷入困境。有人可以帮我从这里出去吗? 提前致谢, 戴夫

有帮助吗?

解决方案

你走在正确的轨道上。试试这个:

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 并进行您可能需要的任何调整,它应该可以解决问题。

其他提示

在最后放一个剪切命令

find /usr/local/svn/repos/ -maxdepth 1 -mindepth 1 -type d -exec echo /usr/local/backup{} \| cut -f1,2,3,9 -d"/"

如何添加 red 过滤器来切断中间部分?

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'
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世纪这类问题的一种优秀方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top