Tìm -exec chạy khô?
Có cách nào để xem kết quả của a find . -exec somecommand {} \;sẽ như thế nào với các thay thế, mà không thực sự chạy các lệnh? Giống như chạy khô (hoặc chạy thử hoặc in)?
Ví dụ: giả sử tôi có cấu trúc tệp sau:
/a/1.txt
/a/2.txt
/a/b/3.txt
Có cách nào để kiểm tra find . type f -exec rm {} \;từ bên trong athư mục sao cho đầu ra sẽ được in ra stdout nhưng không được thực thi chẳng hạn như:
rm 1.txt
rm 2.txt
rm b/3.txt
Cập nhật Lưu ý: rmchỉ là một lệnh ví dụ, tôi quan tâm đến trường hợp chung
Trả lời
Bạn có thể chạy echo rmthay vìrm
find . type f -exec echo rm {} \;
Ngoài ra, findcó -deletetùy chọn để xóa các tệp mà nó tìm thấy
Đối với rmcụ thể, bạn không cần phải -exec: chỉ cần chạy find . -type fvào danh sách, và thêm -deleteđể xóa các tập tin được liệt kê bởi các lệnh trước đó (rõ ràng chặn bất kỳ tập tin phù hợp được tạo / xóa trong khi chờ đợi).
Ngoài ra, đối với các lệnh như rmcó số lượng đối số tùy ý, bạn sẽ muốn thay thế \;bằng +để chạy càng ít lệnh càng tốt.
Nó hơi ngoa, nhưng không giống như các cách tiếp cận bằng cách sử dụng echo, đoạn mã dưới đây xuất ra mã mà bạn có thể chạy trong shell của mình mà không có bất kỳ thay đổi nào để có kết quả chính xác, ngay cả khi tên tệp của bạn chứa dấu ngoặc kép, dấu cách, siêu ký tự shell, v.v.
printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
somecommand {} \;
Lưu ý rằng chuỗi mà chúng tôi đang sử dụng cho -execđối số của chúng tôi là chính xác bash -c "$(declare -f printcmd); "'printcmd "$@"' _- chuỗi $(declare -f printcmd)mở rộng thành mã cho hàm; sau đó, chúng tôi thực sự gọi hàm với các đối số $1trở đi và đặt _làm trình giữ chỗ cho $0.
Bạn có thể thay thế zshhoặc kshthay thế bash, nếu bạn muốn đầu ra thoát cho trình bao đó.