2010-09-28 41 views
22

Tôi đã có hàng ngàn tệp png mà tôi muốn làm nhỏ hơn với pngcrush. Tôi có một công việc đơn giản find .. -exec, nhưng nó là tuần tự. Máy của tôi có khá nhiều tài nguyên và tôi sẽ làm điều này song song.Thực hiện xử lý song song trong bash?

Các hoạt động được thực hiện trên mỗi png là:

pngcrush input output && mv output input 

Lý tưởng nhất là tôi có thể xác định số lượng tối đa các hoạt động song song.

Có cách nào để làm điều này với bash và/hoặc người giúp đỡ vỏ khác không? Tôi là Ubuntu hoặc Debian.

Trả lời

35

Bạn có thể sử dụng xargs để chạy nhiều quy trình song song:

find /path -print0 | xargs -0 -n 1 -P <nr_procs> sh -c 'pngcrush $1 temp.$$ && mv temp.$$ $1' sh 

xargs sẽ đọc danh sách các tập tin được tạo ra bởi find (phân cách bằng 0 ký tự (-0)) và chạy lệnh cung cấp (sh -c '...' sh) với một thông số tại một thời điểm (-n 1). xargs sẽ chạy song song <nr_procs> (-P <nr_procs>).

+0

'$ 1' không có dân cư, tôi cũng đã thử nó với một ví dụ tối thiểu không có may mắn. xargs là 4.4.0, ý tưởng nào? – mark

+0

Tôi quên chỉ định giá trị cho $ 0. Nên được cố định ngay bây giờ. –

+0

đã xác nhận, hoạt động! Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn không? – mark

11

Bạn có thể sử dụng tùy chỉnh find/xargs giải pháp (xem Bart Sas' câu trả lời), nhưng khi mọi thứ trở nên phức tạp hơn bạn có -Tại least- hai lựa chọn mạnh mẽ:

  1. parallel (từ gói moreutils)
  2. GNU parallel
+2

Gói Deb và RPM: https://build.opensuse.org/package/show?package=parallel&project=home%3Atange –

+4

Tôi đánh giá cao GNU song song so với phiên bản nhiều hơn. Nó linh hoạt hơn nhiều. –

+3

tìm/path -print0 | song song -0 pngcrush {} {.}. temp '&&' mv {.}. temp {} –

Các vấn đề liên quan