我试图使用find
来echo 0
为一些文件,但显然这只是作品有sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
但是使用sh -c
with find -exec
使我感到非常不安,因为我怀疑引用问题。我摆弄了一下,显然我的怀疑是有道理的:
我的测试设置:
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
使用no似乎可以
find -exec
毫无问题sh -c
地工作-此处无需引用:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
但是,当我使用时,
sh -c
{}
似乎需要某种形式的引用: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
只要没有文件名包含双引号,双引号就起作用:
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
只要没有文件名包含单引号,单引号就起作用:
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
我还没有找到在所有情况下都适用的解决方案。有什么事我俯瞰,或正在使用sh -c
中find -exec
固有的不安全?
sh
似乎是某种占位符,它的作品太多,如果换成_
例如-如果你想打电话给bash的内部非常有用:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
。但是有人知道在哪里记录吗?