Câu trả lời:
Cách tốt nhất để làm điều đó là sử dụng các tham số vị trí. Và $()được ưu tiên thay thế lệnh ove backticks vì nó dễ đọc hơn (không bị nhầm lẫn với các trích dẫn đơn) và có thể dễ dàng lồng nhau mà không cần phải thực hiện nhiều thao tác thoát.
find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;
Gạch dưới là một giữ chỗ cho $0.
Để làm gì?
find ... -printf 'Blah: %m\n'
Hoặc sử dụng bash -cnếu bạn thực sự phải:
 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
              bash -choặc tương tự.
                    Cách duy nhất để sử dụng chúng (AFAIK) là đặt chúng vào tệp tập lệnh bash và sử dụng tập lệnh trong -exec. Điều tương tự với$()
Đừng quên xargs! Ví dụ của bạn sẽ gọi một quy trình shell mới cho mỗi tệp được tìm thấy.
Tôi thích điều này:
find ... | xargs stat -c "Blah: %a"
findđưa ra một danh sách tất cả mọi thứ được tìm thấy, xargsđọc một danh sách các đối số trên stdinvà thực hiện tham số của nó với các đối số đó trên dòng lệnh, xây dựng một dòng lệnh càng dài càng tốt. Nó hoạt động bởi vì stat, như hầu hết các lệnh / chương trình thích hợp khác, lấy bất kỳ số lượng tham số nào. (so sánh ls, rmvà echoví dụ)
Nếu bạn nghĩ rằng nó hoàn toàn không cần thiết để khởi chạy một quy trình mới cho mỗi tệp, hãy sử dụng xargs -n 1để chỉ truyền 1tham số cho mỗi lệnh. Bằng cách đó bạn có thể bắt chước các phương thức không hiệu quả như thế này:
find ... | xargs -n 1 stat -c "Blah: %a"
(Hãy thử nó trên một hệ thống tập tin lớn trên một máy tính chậm và thời gian khác biệt!)
findđược thực thi và kết quả được sử dụng làm tham số tĩnh để tìm.