Яка різниця між використанням "+" (плюс) та ";" (крапка з комою) в команді -exec?


28

Мені цікаво знати, яка різниця між використанням +та ;в кінці -execкоманди, коли я використовую в findкоманді?

find .... -exec ... \; 

VS

find .... -exec ... + 

Відповіді:


36

-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]...означає, що він може займати більше одного файлу.

+може використовуватися лише для окремих команд, і у вас повинен бути рівно одна {}в рядку. \;може працювати з декількома групами від нуля до багатьох


4
Приклад: з \;, виконана команда буде cat 1; cat 2; cat 3. З +, виконана команда буде cat 1 2 3.
Алаа Алі

AFAIK, +це не POSIX, тому може бути недоступним у системах, що не є Linux. Не викликає занепокоєння, якщо ви ніколи не залишаєте платформу, але добре знати, чи вам коли-небудь доведеться користуватися Solaris. :)
Саймон Ріхтер

О, приємно, дякую за інформацію. Я зазвичай -exec <command> {} ';'тому, що на моєму введенні легше (я можу торкнутися типу, але я не маю найкращої техніки).
hanetzer

2
@SimonRichter: Ні, -exec ... {} +це POSIX. Дивіться: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm

@SimonRichter -exec ... {} +Розширення пропонувалось включити до специфікацій POSIX у 2001 році та ратифіковано у випуску POSIX 6 у 2004 році. Можливо, версія Solaris, до якої ви звикли, є старшою за стандарт POSIX (або просто націлена на попередню версію).
Олі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.