Ich versuche zu verwenden , find
um echo 0
in einige Dateien, aber anscheinend funktioniert dies nur mit sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Bei der Verwendung von sh -c
with find -exec
fühle ich mich jedoch sehr unwohl, da ich den Verdacht habe, Probleme mit Zitaten zu haben. Ich habe ein bisschen damit herumgespielt und anscheinend war mein Verdacht berechtigt:
Mein Testaufbau:
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
Verwenden
find -exec
ohnesh -c
scheint ohne Probleme zu funktionieren - hier ist keine Angabe erforderlich:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Aber wenn ich es benutze,
sh -c
{}
scheint es eine Art Zitat zu erfordern: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
Doppelte Anführungszeichen funktionieren, solange kein Dateiname doppelte Anführungszeichen enthält:
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
Einfache Anführungszeichen funktionieren, solange kein Dateiname einfache Anführungszeichen enthält:
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
Ich habe keine Lösung gefunden, die in allen Fällen funktioniert. Gibt es etwas , das ich mit Blick auf oder verwendet sh -c
in von find -exec
Natur aus unsicher?
sh
scheint eine Art Platzhalter zu sein, ist es auch , wenn ersetzt arbeitet_
beispielsweise - sehr nützlich , wenn Sie bash Interna nennen wollen:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Aber weiß jemand, wo dies dokumentiert ist?$0
(normalerweise der Name der Shell. Sie müssen es in diesem Szenario überspringen, damit es nicht zu einem Ihrer normalen Positionsargumente wird. In der Dokumentation wird dies-c
erwähnt.argv[0]
hier, das ist nur$0
das Skript. Die Seite von Sven ist hier ungenau,r
und die Shell wird nicht in einen eingeschränkten Modus versetzt, soweit dies erkennbar ist, und derzsh
Modus wird basierend auf nicht geändert$0
.(exec -a rksh ksh -c 'cd /')
läuft eingeschränktksh
, aber nichtksh -c 'cd /' rksh
).find
mit-exec sh -c
und Einbettung{}
in die Shell - Code“ ?