Питання двоскладове:
- як же
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може самостійно обробляти дивні назви файлів ..