Một trong những câu trả lời khác gần với điều này:
tìm thấy . -type d -exec sh -c 'cd "$ 0" && cmd ' {} \;
(chỉ chạy lệnh nếu cd
thành công). Một số người khuyên nên chèn một đối số giả, vì vậy thư mục tìm thấy ( {}
) trượt qua $1
:
tìm thấy . -type d -exec sh -c 'cd "$ 1" && cmd ' foo {} ";"
Tất nhiên, bạn có thể sử dụng bất kỳ chuỗi nào ở đây thay cho foo
. Lựa chọn phổ biến bao gồm -
, --
và sh
. Chuỗi này sẽ được sử dụng trong các thông báo lỗi (nếu có), ví dụ:
foo: dòng 0: cd : rict_directory : Quyền bị từ chối
vì vậy sh
dường như là một lựa chọn tốt
\;
và ";"
hoàn toàn tương đương; đó chỉ là một sở thích phong cách.
Các lệnh trên thực thi shell một lần cho mỗi thư mục. Điều này có thể đi kèm với một số hình phạt hiệu suất (đặc biệt nếu lệnh được thực thi là tương đối nhẹ). Các lựa chọn thay thế bao gồm
tìm thấy . -type d -exec sh -c 'cho d; làm (cd "$ d" && cmd ); xong 'sh {} +
trong đó thực thi shell một lần, nhưng chuyển đổi một lần cho mỗi thư mục và
tìm thấy . -type d -exec sh -c 'save_d = $ PWD; cho d; làm cd "$ d" && cmd ; cd "$ save_d"; xong 'sh {} +
mà không sinh ra bất kỳ subshells. Nếu bạn đang tìm kiếm một đường dẫn tuyệt đối, như câu hỏi của bạn cho thấy, bạn có thể kết hợp những điều trên và làm
tìm / nhà / kiểm tra -type d -exec sh -c 'cho d; làm cd "$ d" && cmd ; xong 'sh {} +
không sinh ra bất kỳ mạng con nào và cũng không phải bận tâm đến việc lưu điểm bắt đầu.
pwd
như một bằng chứng về khái niệm?