Произошла ошибка, потому что вы используете много '
. В частности s/$/\/version/
, за пределами одной цитаты.
sed
либо работает с файлом, либо со стандартным вводом. Он не может изменить строку, переданную в качестве параметра. printf
встроенная команда может быть использована для добавления /version
.
Примечания:
- Для каждой строки, прочитанной из
tmp1
файла, извлекается одно имя, поэтому имена не содержат\n
. - в соответствии с использованием
cut
иtr
, результирующие каталоги не будут содержать.
ни;
их имен, ни символов.
То, что вы пытаетесь достичь, это:
cut -d ';' -f 1 tmp1 | tr '.' '/' | xargs -I % bash -c 'mkdir -p "%" ; printf "%s/version/\n" "%"' > output
Обратите внимание, что специальные символы в именах нарушают вышеприведенную командную строку: например, '
(одинарные кавычки).
cut
и tr
может быть заменен только одним, awk
который xargs -0
может использоваться для безопасной обработки имен (разделенных нулевым символом).
Попробуйте эту безопасную версию:
awk -F\; '' tmp1 | xargs -0 bash -c 'for f; do mkdir -p "$";printf "%s/version\n" "$";done' arg0dummy > output
awk
сценарий:
-F\;
определяется;
как разделитель полей, так же$1
как и первое поле (до;
)gsub
используется для замены.
на/
printf
используется для печати результата и вставки окончательного\0
(нулевого) символа.
xargs
:
-0
: Входные элементы заканчиваются нулевым символом вместо пробела, и кавычки и обратный слеш не являются специальными (каждый символ воспринимается буквально). Отключает конец строки файла, который обрабатывается как любой другой аргумент. Полезно, когда элементы ввода могут содержать пробелы, кавычки или обратную косую черту.
bash -c ...
:
arg0dummy
: не используется, но является обязательным; смman bash
.