Если можно использовать Java NIO ( JDK 1.4 или больше ), то я думаю, что Вы ищете java.nio.channels.FileChannel.lock()
В общем xargs используется вот так
прога | Утилита xargs
, где prog
, как ожидается, выведет один или несколько результатов, разделенных символом новой строки / пробела. Уловка состоит в том, что xargs
не обязательно вызывает утилиту
один раз для каждого результата, вместо этого она разбивает результаты на подсписки и вызывает утилиту
для каждого подсписка. Если вы хотите заставить xargs вызывать утилиту
для каждого отдельного результата, вам нужно будет вызывать ее с помощью xargs -L1
.
Хорошим примером того, что делает xargs, является попытка получить отсортированные контрольные суммы для каждого файла в каталоге с помощью find.
find . | cksum | sort
возвращает только одну контрольную сумму, и неясно, для чего она контрольная сумма. Не то, что мы хотим. Канал отправляет stdout из find в stdin для cksum. Что действительно нужно cksum, так это список аргументов командной строки, например
cksum file001.blah file002.blah file003.blah
выдаст три строки, по одной на файл, с желаемыми контрольными суммами. Xargs делает волшебный трюк - преобразует стандартный вывод предыдущей программы во временную и скрытую командную строку для передачи в следующую. Вот работающая командная строка:
find . | xargs cksum | sort
Обратите внимание на отсутствие канала между xargs и cksum.
xargs обычно используется для группировки аргументов вместе, так что вы не получите " слишком много аргументов "ошибка, возникающая при передаче большого количества аргументов команде
#!/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 параметра
$ echo 'line1
> line2
> line3
> ...
> lineN ' | xargs cmd1 -a -b
приведет к следующему:
$ cmd1 -a -b line1 line2 line3 ... lineN
xargs
сломает cmd1 ...
на несколько выполнений cmd1
, если количество строк становится слишком большим.
xargs
может использоваться для многих других задач, связанных с передачей строк stdin
в качестве позиционных аргументов. Обратите внимание на параметр заглавной буквы -P
в xargs (1) для параллельного выполнения нескольких экземпляров команды.