Truyền đối số xargs dưới dạng chuỗi sang lệnh khác với '>'?


9

Giả sử tôi có một loạt các tập tin trong /tmp/.

tôi làm

find . -type f | xargs -iFILES

Và tôi muốn làm một md5sumtrong mỗi tệp, xuất ra một tệp có cùng tên, nhưng có .md5phần mở rộng.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Điều này được cho là để tạo một tệp md5 cho mỗi tệp được tìm thấy bởi lệnh find. Thay vào đó, nó tạo ra một tệp FILES.md5 trên đĩa với tổng kiểm tra từ tất cả các tệp.

Làm thế nào để tôi nói với lệnh md5sum rằng FILES đại diện cho tên tệp hiện tại và không phải là một chuỗi ký tự FILES?

Câu trả lời:


4

Bạn cần một số cách để nói rằng bạn muốn gửi đầu ra của md5summột tệp. Vì find(hoặc xargs) không tích hợp chức năng này và md5sumchỉ biết cách in thành đầu ra tiêu chuẩn, nên việc chuyển hướng vỏ là cách đơn giản nhất.

Lưu ý rằng lệnh của bạn sẽ không hoạt động trong trường hợp chung vì một lý do khác: định dạng đầu ra findkhông phải là định dạng đầu vào xargs, chúng khác với tên tệp chứa khoảng trắng hoặc \"'. Sử dụng find -execthay thế.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;

7

Bạn cần sử dụng một lớp con để xử lý chuyển hướng IO:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'

5

Với GNU Parallel bạn có thể làm:

find . -type f | parallel md5sum {} \> {}.md5

Bạn nhận được lợi ích bổ sung của việc chạy song song md5sum và các tệp như:

My brother's 12" records.txt

sẽ không khiến lệnh của bạn bị sập. Xem video giới thiệu để tìm hiểu thêm: http://www.youtube.com/watch?v=OpaiGYxkSuQ

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.