Sto cercando di usare find
per echo 0
in alcuni file, ma a quanto pare questo funziona solo con sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Ma usare sh -c
con find -exec
mi fa sentire molto a disagio perché sospetto di aver citato problemi. Ci ho provato un po 'e apparentemente i miei sospetti erano giustificati:
La mia configurazione di prova:
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
L'uso
find -exec
senzash -c
sembra funzionare senza problemi - non è necessario un preventivo qui:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Ma quando sto usando
sh -c
{}
sembra richiedere una sorta di preventivo: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
Le virgolette doppie funzionano purché nessun nome di file contenga virgolette doppie:
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
Le virgolette singole funzionano purché nessun nome di file contenga virgolette singole:
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
Non ho trovato una soluzione che funzioni in tutti i casi. C'è qualcosa che mi domina, o sta usando sh -c
in find -exec
intrinsecamente insicuri?
sh
sembra essere una sorta di segnaposto, funziona anche se sostituita da_
per esempio - molto utile se si desidera chiamare interni bash:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Ma qualcuno sa dove questo è documentato?