Понимание команды UNIX xargs

Если можно использовать Java NIO ( JDK 1.4 или больше ), то я думаю, что Вы ищете java.nio.channels.FileChannel.lock()

FileChannel.lock ()

28
задан halluc1nati0n 13 December 2009 в 22:31
поделиться

5 ответов

В общем xargs используется вот так

прога | Утилита xargs

, где prog , как ожидается, выведет один или несколько результатов, разделенных символом новой строки / пробела. Уловка состоит в том, что xargs не обязательно вызывает утилиту один раз для каждого результата, вместо этого она разбивает результаты на подсписки и вызывает утилиту для каждого подсписка. Если вы хотите заставить xargs вызывать утилиту для каждого отдельного результата, вам нужно будет вызывать ее с помощью xargs -L1 .

48
ответ дан 28 November 2019 в 02:44
поделиться

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

find . | cksum  | sort

возвращает только одну контрольную сумму, и неясно, для чего она контрольная сумма. Не то, что мы хотим. Канал отправляет stdout из find в stdin для cksum. Что действительно нужно cksum, так это список аргументов командной строки, например

cksum file001.blah file002.blah  file003.blah

выдаст три строки, по одной на файл, с желаемыми контрольными суммами. Xargs делает волшебный трюк - преобразует стандартный вывод предыдущей программы во временную и скрытую командную строку для передачи в следующую. Вот работающая командная строка:

find . | xargs cksum | sort

Обратите внимание на отсутствие канала между xargs и cksum.

10
ответ дан 28 November 2019 в 02:44
поделиться

xargs обычно используется для группировки аргументов вместе, так что вы не получите " слишком много аргументов "ошибка, возникающая при передаче большого количества аргументов команде

2
ответ дан 28 November 2019 в 02:44
поделиться
#!/bin/sh
#script to echo out the arguments 1 at a time!
for a in $*
do
    echo $a
done

команда

$sh myscript 1 2 3 4 5

выдаст

1
2
3
4
5

, но

$sh myscript 1 2 3 4 5 6 7 8 9 10 11

не будет работать, так как максимальное количество параметров превышено (я на самом деле не уверен, что это за максимум, но допустим, что его 10 для этого примера!)

Чтобы обойти это, мы могли бы использовать

#!/bin/sh
#script to echo out the arguments 1 at a time!
for a in $*
do
    echo $a | xargs echo
done

, мы могли бы затем запустить его следующим образом

 $sh myscript "1 2 3 4 5" "6 7 8 9 10 11"

и получить правильный результат, поскольку есть всего 2 параметра

2
ответ дан 28 November 2019 в 02:44
поделиться
$ echo 'line1
> line2
> line3
> ...
> lineN ' | xargs cmd1 -a -b

приведет к следующему:

$ cmd1 -a -b line1 line2 line3 ... lineN

xargs сломает cmd1 ... на несколько выполнений cmd1 , если количество строк становится слишком большим.

xargs может использоваться для многих других задач, связанных с передачей строк stdin в качестве позиционных аргументов. Обратите внимание на параметр заглавной буквы -P в xargs (1) для параллельного выполнения нескольких экземпляров команды.

8
ответ дан 28 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: