Обычно лучше напрямую, -exec ${tgt_process} \{\} +
но если по какой-либо причине вам необходимо получить надежно разграниченный список имен файлов в файле или потоке find
, то вы можете сделать это:
find -exec sh -c 'printf "///%s///\n" "$@"' -- \{\} +
Из этого вы получаете две уникальные строки. В начале каждого имени файла находится строка, \n///
а в конце каждого имени файла - строка ///\n
. Эти две строки не встречаются нигде в find
выходных данных, кроме как в тех позициях, независимо от того, какие символы содержатся в именах файлов.
Кроме того, вышеприведенное использование является базовым переносимым POSIX и может использоваться практически для любой системы Unix. Это не относится к использованию нулевого байтового разделителя - несмотря на его удобство - рекомендованного некоторыми другими.
Но, опять же, это необходимо только в том случае, если вы не можете напрямую -exec
обратиться $tgt_process
к вам по какой-либо причине, поскольку это должно быть вашей целью. С одной стороны, вышеупомянутый метод все еще требует парсинга. Например, если вы хотите, чтобы каждая оболочка имени файла заключалась в кавычки, вы должны сначала убедиться, что любые жесткие кавычки в имени файла были экранированы:
find ... + | sed 's|'\''|&"&"&|g;s|///|'\''|g'
Это выводит должным образом экранированный массив имен файлов независимо от того, какими могут быть их составные символы. Теперь вам остается только надеяться, что ваше приложение на принимающей стороне не будет портить его.