Tìm -exec chạy khô?

Dec 27 2020

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

18 rAlen Dec 27 2020 at 07:10

Bạn có thể chạy echo rmthay vìrm

find . type f -exec echo rm {} \;

Ngoài ra, find-deletetùy chọn để xóa các tệp mà nó tìm thấy

3 l0b0 Dec 27 2020 at 07:28

Đố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.

2 CharlesDuffy Dec 28 2020 at 00:38

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 đó.