Использование расширения параметров для создания списка аргументов для `mkdir -p`

Обычно это делается путем добавления обработчика SIGHUP , который перезапускает команду после какой-либо другой команды (обычно logrotate ) переместил файл. В операционных системах * nix вы можете перемещать файлы во время их записи (я считаю, с оговоркой, что файлы должны быть в той же файловой системе); дополнительные строки будут добавлены к файлу в новом месте.

10
11.10.2016, 12:20
5 ответов
setopt histsubstpattern extendedglob
mkdir -p /tmp/foo/*(#q/:s_%_/bar_)

Это расширенная подстановка , которая имеет глобальный флаг q uiet , который использует квалификатор glob для соответствия только каталогам и модификатор для выполнения замены s (с использованием символа шаблона % , который доступен только в шаблон подстановки истории режим), который добавляет строку к каждому слову.

man zshexpn
13
27.01.2020, 20:00

Если каталоги находятся в массиве, вы можете использовать форму раскрытия $ {^ ...} .

a=(/tmp/foo/*/)
mkdir -p ${^a}bar
4
27.01.2020, 20:00

Для этого можно использовать 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 '{}' , чтобы быть в курсе последних событий.

0
27.01.2020, 20:00

@loa_in_ имеет большую его часть, но конвейерный вывод find имеет тенденцию быть ошибочным.

find /tmp/foo -maxdepth 1 -mindepth 1 -type d -exec mkdir {}/bar \;
0
27.01.2020, 20:00

Конечно - используйте цикл.

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

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

5
27.01.2020, 20:00

Теги

Похожие вопросы