Я хочу знати , сенс {} +
в exec
команді, і в чому різниця між {} +
і {} \;
. Якщо бути точним, яка різниця між цими двома:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Я хочу знати , сенс {} +
в exec
команді, і в чому різниця між {} +
і {} \;
. Якщо бути точним, яка різниця між цими двома:
find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Відповіді:
Використання ;
(крапка з комою) або +
(знак плюс) є обов'язковою для припинення команд оболонки, на які посилається -exec
/ execdir
.
Різниця між ;
(крапкою з комою) або +
(плюс знак) полягає в тому, як аргументи передаються в пошук -exec
/ -execdir
параметр. Наприклад:
використовуючи ;
виконувати кілька команд (окремо для кожного аргументу),
Приклад:
$ find /etc/rc* -exec echo Arg: {} ';'
Arg: /etc/rc.common
Arg: /etc/rc.common~previous
Arg: /etc/rc.local
Arg: /etc/rc.netboot
Усі наступні аргументи
find
повинні бути аргументами команди.Рядок
{}
замінюється поточним ім'ям файлу, який обробляється.
використання +
виконує найменше можливі команди (оскільки аргументи поєднуються разом). Це дуже схоже на те, як xargs
працює команда, тому вона буде використовувати якомога більше аргументів на команду, щоб уникнути перевищення максимальної межі аргументів на рядок.
Приклад:
$ find /etc/rc* -exec echo Arg: {} '+'
Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
Командний рядок будується додаванням кожного вибраного імені файлу в кінці.
Лише один екземпляр
{}
дозволений в межах команди.
Дивись також:
З огляду на те, що знаходження команди отримує нижче трьох файлів:
fileA
fileB
fileC
Якщо ви використовуєте -exec
знак plus ( +
),
find . -type f -exec chmod 775 {} +
це буде:
chmod 775 fileA fileB fileC
Командний рядок будується додаванням кожного узгодженого імені файлу в кінці, який аналогічно тому, що xargs
будує його командні рядки. Загальна кількість викликів команди ( chmod
у цьому випадку) буде набагато меншою, ніж кількість відповідних файлів.
Якщо ви використовуєте -exec
крапку з комою ( ;
),
find . -type f -exec chmod 775 {} \;
це буде:
chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
Відповідно до man find
:
Команда -exec {} + Цей варіант дії -exec виконує вказану команду для вибраних файлів, але командний рядок будується додаванням кожного вибраного імені файлу в кінці; загальна кількість викликів команди буде значно меншою, ніж кількість відповідних файлів. Командний рядок побудований приблизно так само, як xargs будує свої командні рядки. У межах команди допускається лише один екземпляр "{}". Команда виконується в початковому каталозі.
man find(1)
дуже докладно, його легко знайти будь-хто. Не лінуйся.