Je suis en train d'utiliser find
pour echo 0
dans certains fichiers, mais apparemment , cela fonctionne uniquement avec sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Mais utiliser sh -c
avec find -exec
me fait me sentir très mal à l'aise parce que je soupçonne de citer des problèmes. J'en ai un peu tripoté et apparemment mes soupçons étaient justifiés:
Ma configuration de test:
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
Utiliser
find -exec
sanssh -c
semble fonctionner sans problème - aucune citation n'est nécessaire ici:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Mais lorsque j'utilise
sh -c
{}
semble nécessiter une sorte de citation: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
Les guillemets doubles fonctionnent tant qu'aucun nom de fichier ne contient de guillemets doubles:
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
Les guillemets simples fonctionnent tant qu'aucun nom de fichier ne contient de guillemets simples:
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
Je n'ai pas trouvé de solution qui fonctionne dans tous les cas. Y at - il quelque chose que je donne sur, ou utilise sh -c
en find -exec
soi dangereux?
sh
semble être une sorte d'espace réservé, cela fonctionne aussi si elle est remplacée par_
par exemple - très utile si vous voulez appeler bash internals:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Mais quelqu'un sait-il où cela est documenté?