Використання розширення параметрів для генерації списку аргументів для `mkdir -p`


10

У мене є щось подібне:

% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/

Я хочу створити каталог barпід кожним із підкаталогів під foo.

Якщо я спробую це зробити

% mkdir -p /tmp/foo/*/bar

... я отримую помилку

zsh: no matches found: /tmp/foo/*/bar

(Заднім числом я можу зрозуміти причину помилки.)

Я знаю, що я можу вирішити оригінальну проблему за допомогою циклу for, але мені цікаво знати, чи zshпідтримує якусь форму розширення параметрів, яка б створила потрібний аргумент для одного виклику mkdir -p. IOW, розширення параметра, еквівалентне "додавати /barдо кожного префікса, генерованого розширенням /tmp/foo/*", в результаті чого

% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar

Відповіді:


13
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

Це розширений глобус, у якому є прапоромq uiet glob, який використовує класифікатор глобу для відповідності лише каталогів та модифікатор для виконання sспрощення (використовуючи %символ шаблону, який доступний лише в режимі шаблону заміни історії ), який додає рядок до кожного слова.

man zshexpn

Нічого собі, я вражений. Я навіть знайшов це все на вказаній вами сторінці.
Wildcard

1
Зауважте, що вказано в Оригінальному плакаті mkdir -p, що мало би дещо відрізнятися від вашої команди не видавати помилки, якщо деякі з цих каталогів вже мають barпідкаталоги. Незначний момент, але тут варто зазначити. :)
Wildcard

1
Інший спосіб - використовувати розширення масиву через ${^spec}та додавати barдо кожного елемента, що /tmp/foo/*(/)розгортається: set -- /tmp/foo/*(/)тодіmkdir -p -- "${^@}/bar"
don_crissti

5

Звичайно - використовуйте петлю

for n in /tmp/foo/*; do mkdir "$n/bar";done

глобуси використовуються для розширення списків існуючих елементів, а не речей, які ще не створені.


Вибачте, боюся, моє запитання не було чітко викладене. Я проясню це.
kjo

2
Це не відповідає, якщо zshможна розширити глобуси та додати текст за допомогою одного синтаксису - але я думаю, що це, мабуть, єдиний спосіб робити те, що ти хочеш, @kjo.
Wildcard

4

Якщо каталоги знаходяться в масиві, ви можете використовувати ${^...}форму розширення.

a=(/tmp/foo/*/)
mkdir -p ${^a}bar

0

Ви можете використовувати findта xargsробити це:

find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar

який використовує -maxdepth 1та -mindepth 1запобігає створенню barв підкаталогах цілей, і /tmp/fooсам по собі відповідно. type dзмушує розглядати лише каталоги.

Ви повинні видалити, echoщоб виконати фактичні дії, інакше echoбуде роздруковано лише рядки для виконання. Ви також можете долучити його до заміни, як $()виконувати його.

Керівництво каже , що xargs -iзасуджується, але я не знайшов ніякого іншого настільки ж зручний варіант, так що повинно працювати в протягом декількох років ... Ви можете замінити -iз , -I'{}'щоб завжди бути в курсі , що.


Ця відповідь і наступна мені добре виглядають. Чи може хтось пояснити, чому за них слід голосувати? Голосування вниз - це добре, але як ми можемо дізнатися, якщо не наводиться причин?
Джо

Це діюча альтернатива, яка не робить нічого, окрім того, що просила ОП Биє мене.
loa_in_

Я думаю, що це якесь упередження, що відповіді повинні мати на них погані відповіді, тому забобони взяли це на мою репутацію.
loa_in_

Мені не подобаються незрозумілі голоси, але я не бачив таких упереджень. Зазвичай "погані" відповіді (ті, які я розумію) насправді погані.
Джо

0

У @loa_in_ було більшу частину цього, але findвихідні трубопроводи, як правило, є штучним пасом.

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;

Я просто використовую xargsрізні інструменти, які не мають -execальтернативи, тому я використовую свій підхід, оскільки він працює з усіма однаково.
loa_in_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.