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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.