Saya mencoba menggunakan find
ke echo 0
dalam beberapa file, tetapi ternyata ini hanya berfungsi dengan sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Tetapi menggunakan sh -c
dengan find -exec
membuat saya merasa sangat tidak nyaman karena saya curiga mengutip masalah. Saya sedikit mengotak-atik itu dan tampaknya kecurigaan saya dibenarkan:
Setup pengujian saya:
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
Penggunaan
find -exec
tanpash -c
tampaknya berfungsi tanpa masalah - tidak perlu mengutip di sini:martin@dogmeat ~ % find findtest -type f -exec cat {} \; one two three
Tetapi ketika saya menggunakan
sh -c
{}
tampaknya membutuhkan semacam kutipan: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
Kutipan ganda berfungsi selama tidak ada nama file yang mengandung tanda kutip ganda:
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
Kutipan tunggal berfungsi selama tidak ada nama file yang mengandung tanda kutip tunggal:
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
Saya belum menemukan solusi yang berfungsi dalam semua kasus. Apakah ada sesuatu yang saya abaikan, atau gunakan sh -c
pada find -exec
dasarnya tidak aman?
sh
tampaknya menjadi semacam placeholder, ia bekerja juga jika diganti dengan_
misalnya - sangat berguna jika Anda ingin menyebutnya internal bash:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Tetapi apakah ada yang tahu di mana ini didokumentasikan?