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