И так, было интересно посмотреть на ваши варианты, один из них даже пробил то, о чем пойдет речь.
Возможно, способ не самый минималистичный, но мне понравился используемый стек)
Сразу не пугайтесь, все разберем:
$ seq 1 10 | xargs -I{} bash -c "echo \"file{}.txt\" > file{}.txt"
1) seq 1 10 - генерирует последовательность чисел 1-10. Каждое число будет выведено в новой строке:
$ seq 1 10
1
2
3
...
2) конвейер '|' - используется для того, чтобы команда xargs получила на вход (STDIN) вывод (STDOUT) предыдущей команды seq.
В результате xargs будет работать с последовательностью 1-10;
3) "xargs -I{}" - утилита xargs позволяет выполнять произвольную команду для одного либо нескольких входных значений. В данном случае входные значения передаются через конвейер.
Мы детально ее разберем отдельно. Пока вам нужно знать только то, что xargs выполнит "bash -c" для каждого элемента от 1 до 10.
"-I{}" позволяет определить место входных данных в сгенерированной команде. По умолчанию они идут в конец. Вместо "{}" может быть что угодно. Это, своего рода, шаблон.
В результате каждый элемент 1-10 будет подставлен в нужное нам место внутри команды:
$ seq 1 10 | xargs -I{} echo "file{}.txt"
file1.txt
file2.txt
file3.txt
4) "bash -c" - ну тут-то вы уже подкованы).
Если коротко, таким образом мы запускаем дочернюю оболочку и выполняем в ней команду.
Без доп. оболочки тут обойтись не получится, т.к. для перенаправления xargs не выполнит подстановку по шаблону.
Вернее, '>' вообще не будет частью xargs и отработает в первую очередь, еще до самой команды:
$ seq 10 | xargs -I{} echoo file{}.txt > file{}.txt
xargs: echoo: No such file or directory
$ ls
file{}.txt
5) "echo \"file{}.txt\" > file{}.txt" - строка, которую bash выполнит для каждого значения от 1 до 10 ({}).
"echo \"file{}.txt\" > file{}.txt" - записывает текст fileX.txt в файл fileX.txt. Сам файл создается при перенаправлении вывода, которое мы разбирали тут.
\"\" - экранирование символов, которое необходимо, чтобы избежать разрыва, т.к. строка команды также находится внутри двойных кавычек.
Обратный слэш сообщает bash, что кавычки - это часть текста, а не завершающий символ;
LinuxCamp
