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 -c
nếu bạn thực sự phải:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
hoặ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 stdin
và 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
, rm
và echo
ví 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 1
tham 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.