Питання двоскладове:
- як же
find
керувати за програмами обробки викликів з використанням -exec
не стикаючись з проблемами просторів , вкладених в іменах файлів, і
- який хороший
-print0
варіант?
По-перше, find
здійснює системний виклик, фактично один із групи пов'язаних дзвінків, що називаються "exec" . Він передає ім'я файлу як аргумент безпосередньо цьому виклику, який потім передається безпосередньо (після створення нового процесу), не втрачаючи інформації про ім'я файлу.
POSIX find
особливість +
пояснюється наступним чином , в обгрунтуванні :
Особливістю find
утиліти SVR4 був -exec
первинний + термінатор. Це дозволило згрупувати назви файлів, що містять спеціальні символи (особливо символи нового рядка ), без проблем, які виникають, якщо такі назви файлів переносяться xargs
. Інші реалізації додали інші способи подолати цю проблему, зокрема -print0
первинний, який записав назви файлів з нульовим байтовим термінатором. Це було розглянуто тут, але не прийнято. Використання нульового термінатора означало, що будь-яка утиліта, яка збиралася обробити -print0
висновок пошуку,
повинна додати нову опцію для розбору нульових термінаторів, які вона зараз читатиме.
Це « в зокрема-print0
, первинний» відноситься до GNU find
і xargs
які вирішують цю проблему по-іншому. Він також підтримується FreeBSD find
та xargs
. Якщо ви додали до виклику -0
опцію (див . Сторінку керівництва ) xargs
, програма приймає рядки, що закінчуються символами "null byte". У свою чергу, xargs
викликає exec -функції, щоб зробити свою роботу. Основна відмінність між функцією -print0
та -0
ознакою від +
функції полягає в тому, що перша передає назви файлів по трубі, а друга - ні. Розробники знаходять використання майже для будь-якої функції; труби не є винятком.
Повернення до прикладу OP, який використовує -t
параметр cp
: що не знайдено в POSIX cp . Скоріше, це розширення (відоме також як "нестандартна функція"), надане GNU cp . -0
Розширення xargs
не поліпшить цей приклад, але є й інші випадки , коли можуть бути ефективно використані по підтримці на увазі , що є портативна альтернатива +
, яка GNU find
приймає.
find..exec
може самостійно обробляти дивні назви файлів ..