Що означає {} + у команді find -exec?


23

Я хочу знати , сенс {} +в execкоманді, і в чому різниця між {} +і {} \;. Якщо бути точним, яка різниця між цими двома:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;

5
Він описаний man find(1)дуже докладно, його легко знайти будь-хто. Не лінуйся.
Мирослав Кошкар

Дякую, дорогий Мирослав, я шукав man exec!

Ах, я ніколи раніше не натрапляв на {} +використання. Я зазвичай використовую xargs для цього (і часто find ... -print0 | xargs -0 ...)

Відповіді:


27

Використання ;(крапка з комою) або +(знак плюс) є обов'язковою для припинення команд оболонки, на які посилається -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
    

    Командний рядок будується додаванням кожного вибраного імені файлу в кінці.

    Лише один екземпляр {}дозволений в межах команди.

Дивись також:


Там є різниця і головний. Див user1116056 ігрового відповідь
Jahid

24

З огляду на те, що знаходження команди отримує нижче трьох файлів:

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

5

Відповідно до man find:

Команда -exec {} + Цей варіант дії -exec виконує вказану команду для вибраних файлів, але командний рядок будується додаванням кожного вибраного імені файлу в кінці; загальна кількість викликів команди буде значно меншою, ніж кількість відповідних файлів. Командний рядок побудований приблизно так само, як xargs будує свої командні рядки. У межах команди допускається лише один екземпляр "{}". Команда виконується в початковому каталозі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.