У меня есть что-то вроде этого:
% 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
mkdir -p
, который будет немного отличаться от вашей команды не выдавать ошибки, если некоторые из этих каталогов уже имеютbar
подкаталоги. Незначительный момент, но стоит отметить здесь. :)${^spec}
и добавлятьbar
к каждому элементу все, что/tmp/foo/*(/)
расширяется:set -- /tmp/foo/*(/)
thenmkdir -p -- "${^@}/bar"
Конечно - используйте петлю
Глобусы используются для расширения списков существующих предметов, а не вещей, которые еще не были созданы.
источник
zsh
можно расширить глобусы и добавить текст с одним синтаксисом, но я думаю, что это, вероятно, единственный способ сделать то, что вы хотите, @kjo.Если каталоги находятся в массиве, вы можете использовать
${^...}
форму расширения.источник
Вы можете использовать
find
иxargs
сделать это:который использует
-maxdepth 1
и-mindepth 1
для предотвращения созданияbar
в подкаталогах целей, и/tmp/foo
сам по себе соответственно.type d
заставляет рассматривать только каталоги.Вы должны удалить,
echo
чтобы выполнить реальные действия, в противном случаеecho
будут только распечатывать строки для выполнения. Вы также можете заключить его в подстановку, например,$()
выполнить его.Руководство говорит , что
xargs -i
осуждается, но я не нашел никакого другого столь же удобный вариант, так что должно работать в течение нескольких лет ... Вы можете заменить-i
с ,-I'{}'
чтобы всегда быть в курсе , что.источник
У @loa_in_ было большинство из этого, но
find
вывод по трубопроводу, как правило, ложная ошибка .источник
xargs
разные инструменты, у которых нет-exec
альтернативы, поэтому я использую свой подход, поскольку он одинаково работает со всеми из них.