Обычно это делается путем добавления обработчика SIGHUP , который перезапускает команду после какой-либо другой команды (обычно logrotate
) переместил файл. В операционных системах * nix вы можете перемещать файлы во время их записи (я считаю, с оговоркой, что файлы должны быть в той же файловой системе); дополнительные строки будут добавлены к файлу в новом месте.
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)
Это расширенная подстановка , которая имеет глобальный флаг q
uiet , который использует квалификатор glob для соответствия только каталогам и модификатор для выполнения замены s
(с использованием символа шаблона %
, который доступен только в шаблон подстановки истории режим), который добавляет строку к каждому слову.
man zshexpn
Если каталоги находятся в массиве, вы можете использовать форму раскрытия $ {^ ...}
.
a=(/tmp/foo/*/)
mkdir -p ${^a}bar
Для этого можно использовать find
и xargs
:
find /tmp/foo -maxdepth 1 -mindepth 1 -type d | xargs -i echo mkdir -p {}/bar
который использует -maxdepth 1
и -mindepth 1
для предотвращения создания bar
в подкаталогах целей и в самом / tmp / foo
соответственно. тип d
заставляет рассматривать только каталоги.
Вы должны удалить echo
для выполнения фактических действий, иначе echo
будет распечатывать только строки для выполнения. Вы также можете заключить его в замену, например $ ()
, чтобы выполнить его.
В руководстве указано, что xargs -i
устарел, но я не нашел другой столь же удобной альтернативы, поэтому он должен работать еще несколько лет ...
Вы можете заменить -i
с -I '{}'
, чтобы быть в курсе последних событий.
@loa_in_ имеет большую его часть, но конвейерный вывод find
имеет тенденцию быть ошибочным.
find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;
Конечно - используйте цикл.
for n in /tmp/foo/*; do mkdir "$n/bar";done
глобусы используются для расширения списков существующих элементов, а не вещей, которые еще не были созданы.