Tôi đang cố gắng sử dụng find
để echo 0
và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 -c
với find -exec
là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 spaces
Sử dụng
find -exec
màsh -c
dườ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 three
Như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 directory
Dấ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 directory
Dấ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 -c
trong find -exec
vốn đã không an toàn?
sh
dườ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?