Я намагаюся використовувати , find
щоб echo 0
в деякі файли, але , мабуть , це працює тільки з sh -c
:
find /proc/sys/net/ipv6 -name accept_ra -exec sh -c 'echo 0 > {}' \;
Але використання sh -c
з допомогою 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
Використання
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
здається, якийсь - то заповнювач, він теж працює , якщо замінений_
, наприклад , - дуже корисно , якщо ви хочете викликати Баш нутрощів:find /tmp -name 'fil*' -exec bash -c 'printf "%q\n" "$1"' _ {} \;
. Але чи хтось знає, де це зафіксовано?