web-dev-qa-db-ja.com

「{}」を使用して、findの-execオプションで実行されたコマンドの出力をリダイレクトするにはどうすればよいですか?

バックアップスクリプトのsvnadmin dumpコマンドを自動化しようとしています。次のようにしたいのですが。

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

これは/var/svnの各svnリポジトリを調べ、svnadmin dumpを実行するという点で機能しているようです。

ただし、execコマンドの2番目の{}は、処理中のディレクトリの名前に置き換えられません。基本的には、{}.svnという名前の単一のファイルが生成されます。

これは、シェルが>を解釈してfindコマンドを終了し、stdoutをそのコマンドから{}.svnという名前のファイルにリダイレクトしようとしたためと考えられます。

何か案は?

28
pkaeding

次のようにリダイレクトできます。

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

正しい置換が行われます。

いいえ、ただし、それを行う簡単な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 '{}' \;
5
OneOfOne