GNU параллельные аргументы - PullRequest
2 голосов
/ 06 мая 2019

Из примера

seq 1 100 | parallel -I @@ \ > 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}

Как работает -X , @@, {}?Кроме того, что будет поведение, когда «1» или «.»передается внутри {}?Используется ли здесь /> для перенаправления?

Я пытался пройти учебник из https://www.youtube.com/watch?v=P40akGWJ_gY&list=PL284C9FF2488BC6D1&index=2 и читал страницу с параллельными страницами man.Я могу собрать некоторые базовые знания, но не совсем точно, как их использовать или как таковые.

1 Ответ

1 голос
/ 12 мая 2019

Давайте сделаем сначала простые вещи.

Обратная косая черта (\) просто говорит оболочке, что следующая строка является продолжением текущей, а знак «больше» (>) - это оболочка, запрашивающая продолжение строки. Он ничем не отличается от набора текста:

echo \
hi

где вы на самом деле увидите это:

echo \
> hi
hi

Итак, я говорю, что вы можете игнорировать \> и просто запустить команду в одной строке.


Далее, вещи в {}. Они описаны на справочной странице GNU Parallel , но по существу:

  • {1} относится к первому параметру
  • {2} относится ко второму параметру и т. Д.

Проверьте это следующим образом, где разделитель столбцов установлен на пробел, но мы используем параметры в обратном порядке:

echo A B | parallel --colsep ' ' echo {2} {1}
B A

  • {.} относится к параметру, обычно имени файла, с удаленным расширением

Проверьте это с помощью:

echo fred.dat | parallel echo {.}
fred

Теперь давайте перейдем к актуальному вопросу, удалив строку продолжения, как описано выше, и все в одной строке:

seq 1 100 | parallel -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

Итак, это по сути работает:

seq 1 100 | parallel -I @@ 'ANOTHER COMMAND'

В этой команде Оле использовал @@ вместо {}, чтобы подстановки, используемые во второй, внутренней, параллельной команде, не путались друг с другом. Итак, там, где вы видите @@, вам просто нужно заменить его значениями из первых seq 1 100.

Вторая параллельная команда почти такая же, как и первая, но здесь Оле использовал X. Если вы посмотрите видео, на которое вы ссылаетесь, вы увидите, что он ранее показал вам, как это работает. Фактически он передает «столько параметров, сколько возможно» команде в соответствии с ARGMAX системы. Итак, если вы хотите создать 10 000 каталогов, вместо этого:

seq 1 10000 | parallel mkdir {}

, который запустит 10000 отдельных процессов, каждый из которых работает mkdir, вы запустите один mkdir, но с 10 000 параметров:

seq 1 10000 | parallel -X mkdir

Это избавляет от необходимости создавать 10 000 отдельных процессов и ускоряет процесс.


Давайте теперь посмотрим на внешний вызов parallel и проведем пробный прогон, чтобы увидеть, что он будет делать, фактически ничего не делая:

seq 1 100 | parallel -k --dry-run -I @@ 'mkdir top-@@;seq 1 100 | parallel -X mkdir top-@@/sub-{}'

выход

mkdir top-1;seq 1 100 | parallel -X mkdir top-1/sub-{}
mkdir top-2;seq 1 100 | parallel -X mkdir top-2/sub-{}
mkdir top-3;seq 1 100 | parallel -X mkdir top-3/sub-{}
mkdir top-4;seq 1 100 | parallel -X mkdir top-4/sub-{}
mkdir top-5;seq 1 100 | parallel -X mkdir top-5/sub-{}
mkdir top-6;seq 1 100 | parallel -X mkdir top-6/sub-{}
mkdir top-7;seq 1 100 | parallel -X mkdir top-7/sub-{}
mkdir top-8;seq 1 100 | parallel -X mkdir top-8/sub-{}
...
...
mkdir top-99;seq 1 100 | parallel -X mkdir top-99/sub-{}
mkdir top-100;seq 1 100 | parallel -X mkdir top-100/sub-{}

Итак, теперь вы видите, что он собирается запустить 100 процессов, каждый из которых создаст каталог, затем запустит 100 дополнительных процессов, каждый из которых создаст 100 подкаталогов.

...