如何使用'{}'重定向通过find的-exec选项运行的命令的输出?


28

我正在尝试自动svnadmin dump执行备份脚本命令,并且我想执行以下操作:

find /var/svn/* \( ! -name dir -prune \) -type d -exec svnadmin dump {} > {}.svn \;

这似乎可行,因为它可以浏览中的每个svn存储库/var/svnsvnadmin dump在其上运行。

但是,{}exec命令中的第二个不会替换为正在处理的目录的名称。它基本上只会产生一个名为的文件{}.svn

我怀疑这是因为shell解释>为结束find命令,并且它尝试将stdout从该命令重定向到名为的文件{}.svn

有任何想法吗?

Answers:


37

您可以像这样进行重定向:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh -c 'svnadmin dump {} > {}.svn' \;

然后将进行正确的替换。


这是有缺陷的做法。比较我的这个答案。正确的方法是通过{}作为参数传递给sh,然后(内sh)指的是其作为"$0""$1"左右。
卡米尔Maciorowski

5

不,但是您可以编写一个简单的bash脚本来执行此操作,然后从find中调用它。
范例(/tmp/dump.sh):

#!/bin/sh
svn admin dump "$1" > "$1".svn

然后:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.