Tôi có một tập lệnh chỉ ghi dữ liệu vào stdout
. Tôi cần phải chạy nó cho nhiều tập tin và tạo ra một tập tin đầu ra khác nhau cho mỗi tập tin đầu vào và tôi đã tự hỏi làm thế nào để sử dụng find -exec
cho điều đó. Vì vậy, tôi về cơ bản đã thử một số biến thể của này (tôi đã thay thế các script by cat
chỉ dành riêng cho mục đích testability):Chuyển hướng stdout bằng find -exec và không tạo shell mới
tìm * -type f -exec mèo "{}"> "{} .stdout" \;
nhưng không thể hoạt động vì tất cả dữ liệu đã được ghi vào tệp có tên là {}.stdout
.
Cuối cùng, tôi có thể làm cho nó làm việc với:
find * -type f -exec sh -c "mèo {}> {} .stdout" \;
Nhưng trong khi hình thức mới nhất này hoạt động tốt với cat
, kịch bản của tôi đòi hỏi phải có các biến môi trường được nạp thông qua một số kịch bản khởi tạo, vì vậy tôi kết thúc với:
find * -type f -exec sh -c " initscript1; initscript2; ...; myscript {}> {} .stdout "\;
Có vẻ như lãng phí vì tôi đã khởi tạo mọi thứ trong trình bao hiện tại của mình.
Có cách nào tốt hơn để thực hiện việc này với find
không? Một lớp lót khác được chào đón.
Nếu chúng được khởi tạo trong vỏ ban đầu của bạn, nhưng không được đặt trong vỏ con, thì chúng không phải là biến môi trường. Viết 'set -a' ở đầu các bản inits của bạn. –
Là ví dụ cuối cùng bạn đưa ra đúng, hoặc là lệnh: 'find. -type f -exec sh -c ". initscript1;. initscript2; ...; myscript {}> {} .stdout" \; '(Thay vì chỉ đơn giản gọi' initscript1', bạn đang thực sự gọi '. Initscript1', nghĩa là bạn đang tìm nguồn cung ứng tệp với lệnh dấu chấm). –