Помилка отримана, оскільки ви використовуєте багато '. Зокрема 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.