Tôi đang cố gắng sử dụng findđể echo 0vào một số tệp, nhưng rõ ràng điều này chỉ hoạt động với sh -c:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Nhưng sử dụng sh -cvới find -execlàm cho tôi cảm thấy rất khó chịu vì tôi nghi ngờ trích dẫn vấn đề. Tôi loay hoay một chút với nó và rõ ràng sự nghi ngờ của tôi đã được chứng minh:
Thiết lập thử nghiệm của tôi:
martin@dogmeat ~ % cd findtest martin@dogmeat ~/findtest % echo one > file\ with\ spaces martin@dogmeat ~/findtest % echo two > file\ with\ \'single\ quotes\' martin@dogmeat ~/findtest % echo three > file\ with\ \"double\ quotes\" martin@dogmeat ~/findtest % ll insgesamt 12K -rw-rw-r-- 1 martin martin 6 Sep 17 12:01 file with "double quotes" -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with 'single quotes' -rw-rw-r-- 1 martin martin 4 Sep 17 12:01 file with spacesSử dụng
find -execmàsh -cdường như không hoạt động mà không có vấn đề - không cần trích dẫn ở đây:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two threeNhưng khi tôi đang sử dụng
sh -c{}dường như yêu cầu một số loại trích dẫn:martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat {}' \; cat: findtest/file: No such file or directory cat: with: No such file or directory cat: spaces: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: single quotes: No such file or directory cat: findtest/file: No such file or directory cat: with: No such file or directory cat: double quotes: No such file or directoryDấu ngoặc kép hoạt động miễn là không có tên tệp nào chứa dấu ngoặc kép:
martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c 'cat "{}"' \; one two cat: findtest/file with double: No such file or directory cat: quotes: No such file or directoryDấu ngoặc đơn hoạt động miễn là không có tên tệp nào chứa dấu ngoặc đơn:
martin@dogmeat ~ % LANG=C find findtest -type f -exec sh -c "cat '{}'" \; one cat: findtest/file with single: No such file or directory cat: quotes: No such file or directory three
Tôi đã không tìm thấy một giải pháp hoạt động trong mọi trường hợp. Có cái gì tôi đang nhìn, hoặc được sử dụng sh -ctrong find -execvốn đã không an toàn?
shdường như là một loại giữ chỗ, nó cũng hoạt động nếu được thay thế bằng_ví dụ - rất hữu ích nếu bạn muốn gọi bash internals :find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;. Nhưng có ai biết nơi này được ghi nhận?