Заставьте xargs выполнить команду один раз для каждой строки ввода - PullRequest
294 голосов
/ 14 октября 2008

Как я могу заставить xargs выполнять команду ровно один раз для каждой заданной строки ввода? Поведение по умолчанию состоит в том, чтобы разбить строки и выполнить команду один раз, передавая несколько строк каждому экземпляру.

С http://en.wikipedia.org/wiki/Xargs:

find / path -type f -print0 | xargs -0 rm

В этом примере команда find вводит в xargs длинный список имен файлов. Затем xargs разбивает этот список на подсписки и вызывает rm один раз для каждого подсписка. Это более эффективно, чем эта функционально эквивалентная версия:

find / path -type f -exec rm '{}' \;

Я знаю, что find имеет флаг "exec". Я просто цитирую иллюстративный пример из другого ресурса.

Ответы [ 13 ]

0 голосов
/ 06 марта 2016

Кажется, у меня недостаточно репутации, чтобы добавить комментарий к ответу Тобиа выше , поэтому я добавляю этот "ответ", чтобы помочь тем из нас, кто хочет экспериментировать с xargs таким же образом на платформах Windows.

Вот пакетный файл Windows, который делает то же самое, что и быстро закодированный скрипт «show» Tobia:

@echo off
REM
REM  cool trick of using "set" to echo without new line
REM  (from:  http://www.psteiner.com/2012/05/windows-batch-echo-without-new-line.html)
REM
if "%~1" == "" (
    exit /b
)

<nul set /p=Args:  "%~1"
shift

:start
if not "%~1" == "" (
    <nul set /p=, "%~1"
    shift
    goto start
)
echo.
0 голосов
/ 15 апреля 2010

выполнить очистку муравьиной задачи для каждого файла build.xml в текущей или вложенной папке.

find . -name 'build.xml' -exec ant -f {} clean-all \;
0 голосов
/ 14 октября 2008

В вашем примере смысл передачи вывода find в xargs заключается в том, что стандартное поведение параметра find -exec - выполнение команды один раз для каждого найденного файла. Если вы используете find и вам нужно его стандартное поведение, тогда ответ прост - не используйте xargs для начала.

...