2012-03-10 10 views
23

Tôi có rất nhiều hình ảnh mà tôi muốn xử lý với pngquant. Chúng được tổ chức theo cấu trúc thư mục khá sâu, do đó, rất tốn thời gian để tự cd vào mỗi thư mục và chạy pngquant -ext .png -force 256 *.pngCác tệp xử lý theo lô đệ quy với pngquant

Có cách nào để lệnh này chạy trên mọi tệp * .png trong mọi thư mục trong hiện tại, như nhiều lớp sâu khi cần thiết?

+1

điều hành nào là bạn không? – Manish

Trả lời

47

Nếu bạn có chiều sâu hạn chế về thư mục và không quá nhiều tác phẩm, giải pháp sau đó lười biếng:

pngquant *.png */*.png */*/*.png 

Một giải pháp tiêu chuẩn:

find . -name '*.png' -exec pngquant --ext .png --force 256 {} \; 

và phiên bản đa lõi:

find . -name '*.png' -print0 | xargs -0 -P8 -L1 pngquant --ext .png --force 256 

trong đó -P8 xác định số lượng CPU và -L1 xác định umber của hình ảnh để xử lý trong một cuộc gọi pngquant (tôi sử dụng -L4 cho các thư mục với rất nhiều hình ảnh nhỏ để tiết kiệm khi bắt đầu quá trình).

+2

'tìm. -name '* .png' -exec pngquant -ext .png -force 256 {} \; 'hoạt động rất tốt cho tôi. Cảm ơn bạn. – cmal

+0

Cảm ơn bạn đã trả lời, đã làm việc như một sự quyến rũ đối với tôi. Tuy nhiên, bạn có thể giải thích cú pháp về số lượng lõi không? Đó có phải là tùy chọn pngquant hoặc tùy chọn hệ điều hành có chia các tác vụ và cung cấp một số hình ảnh cho mỗi chuỗi không? – Nicolas

+0

@Stewie đó là tùy chọn 'xargs' 'cho phép chạy số lượng tác vụ song song. – Kornel

13

Với fish shell bạn có thể chạy sau từ thư mục gốc của thư mục dự án của bạn

pngquant **.png 

Mà sẽ tạo tập tin mới với phần mở rộng như -or8.png hoặc -fs8.png.

Nếu bạn muốn ghi đè lên các tập tin hiện có, bạn có thể sử dụng hệ thống

pngquant **.png --ext .png --force