Відповіді:
-exec ... \;
буде запускати один елемент за іншим. Отже, якщо у вас є три файли, рядок виконання буде виконуватися три рази.
-exec ... {} +
для команд , які можуть мати більше одного файлу одночасно (наприклад cat
, stat
, ls
). Файли, знайдені, find
пов'язані між собою, як xargs
команда. Це означає, що менше розщеплення і для невеликих операцій може означати значну швидкість.
Ось демонстрація продуктивності, що містить 10 000 порожніх файлів.
$ mkdir testdir
$ touch testdir/{0000..9999}
$ time find testdir/ -type f -exec cat {} \;
real 0m8.622s
user 0m0.452s
sys 0m8.288s
$ time find testdir/ -type f -exec cat {} +
real 0m0.052s
user 0m0.015s
sys 0m0.037s
Знову це працює лише на команди, які можуть приймати кілька імен файлів. Ви можете розібратися, чи така ваша команда, переглянувши її сторінку. Ось конспект із man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
Еліпсис [FILE]...
означає, що він може займати більше одного файлу.
+
може використовуватися лише для окремих команд, і у вас повинен бути рівно одна {}
в рядку. \;
може працювати з декількома групами від нуля до багатьох
+
це не POSIX, тому може бути недоступним у системах, що не є Linux. Не викликає занепокоєння, якщо ви ніколи не залишаєте платформу, але добре знати, чи вам коли-небудь доведеться користуватися Solaris. :)
-exec <command> {} ';'
тому, що на моєму введенні легше (я можу торкнутися типу, але я не маю найкращої техніки).
-exec ... {} +
це POSIX. Дивіться: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
-exec ... {} +
Розширення пропонувалось включити до специфікацій POSIX у 2001 році та ратифіковано у випуску POSIX 6 у 2004 році. Можливо, версія Solaris, до якої ви звикли, є старшою за стандарт POSIX (або просто націлена на попередню версію).
\;
, виконана команда будеcat 1; cat 2; cat 3
. З+
, виконана команда будеcat 1 2 3
.