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