Bagaimana saya bisa menggunakan '{}' untuk mengarahkan output dari perintah yang dijalankan melalui opsi -exec find?

28

Saya mencoba mengotomatiskan svnadmin dumpperintah untuk skrip cadangan, dan saya ingin melakukan sesuatu seperti ini:

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

Ini tampaknya bekerja, karena ia melihat melalui setiap repositori svn di /var/svn, dan berjalan svnadmin dumpdi atasnya.

Namun, yang kedua {}dalam perintah exec tidak bisa diganti dengan nama direktori yang sedang diproses. Pada dasarnya hanya menghasilkan satu file bernama {}.svn.

Saya menduga ini karena shell menginterpretasikan >untuk mengakhiri findperintah, dan ia mencoba mengarahkan ulang stdout dari perintah itu ke file bernama {}.svn.

Ada ide?

pkaeding
sumber

Jawaban:

37

Anda dapat melakukan pengalihan seperti ini:

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

dan penggantian yang benar akan dilakukan.

Dijeda sampai pemberitahuan lebih lanjut.
sumber
Ini adalah kesalahan dan praktik yang buruk. Bandingkan jawaban saya ini . Cara yang benar adalah untuk lulus {}sebagai argumen untuk shdan kemudian (dalam sh) menyebutnya sebagai "$0"atau "$1"atau lebih.
Kamil Maciorowski
5

Tidak, namun Anda dapat menulis skrip bash sederhana untuk melakukannya kemudian memanggilnya dari find.
Contoh ( /tmp/dump.sh ):

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

kemudian:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
OneOfOne
sumber