Làm cách nào tôi có thể sử dụng '{}' để chuyển hướng đầu ra của lệnh chạy thông qua tùy chọn find -exec?


28

Tôi đang cố gắng tự động hóa một svnadmin dumplệnh cho một kịch bản sao lưu và tôi muốn làm một cái gì đó như thế này:

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

Điều này dường như hoạt động, trong đó nó xem qua từng kho lưu trữ svn /var/svnvà chạy svnadmin dumptrên nó.

Tuy nhiên, lệnh thứ hai {}trong lệnh exec không được thay thế cho tên của thư mục đang được xử lý. Về cơ bản nó chỉ dẫn đến một tệp duy nhất có tên {}.svn.

Tôi nghi ngờ rằng điều này là do shell diễn giải >để kết thúc findlệnh và nó cố gắng chuyển hướng thiết bị xuất chuẩn từ lệnh đó sang tệp có tên {}.svn.

Có ý kiến ​​gì không?

Câu trả lời:


37

Bạn có thể thực hiện chuyển hướng như thế này:

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

và sự thay thế chính xác sẽ được thực hiện.


Đây là thiếu sót và thực hành xấu. So sánh câu trả lời này của tôi . Một cách đúng đắn là phải vượt qua {}như một đối số shvà sau đó (bên trong sh) đề cập đến nó như là "$0"hay "$1"hoặc lâu hơn.
Kamil Maciorowski

5

Không, tuy nhiên bạn có thể viết một tập lệnh bash đơn giản để làm điều đó sau đó gọi nó từ find.
Ví dụ ( /tmp/dump.sh ):

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

sau đó:

find /var/svn/* \( ! -name dir -prune \) -type d -exec sh /tmp/dump.sh '{}' \;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.