Могу ли я выполнить команду для каждого результата преобразования файла в zsh без for ?

#shell #foreach #zsh #glob

#оболочка #foreach #zsh #глоб

Вопрос:

Я ищу away для выполнения текущей команды для каждого результата преобразования файла без создания цикла for. Я где-то это видел, но не могу вспомнить, где именно.

(Echo — это просто пример, он также должен работать, например, с psql)

Пример:

 $ touch aaa bbb ccc ddd
$ echo "--- " [a-c]*
---  aaa bbb ccc
  

Желаемый результат:

 ---  aaa
---  bbb
---  ccc
  

Каким образом:

 $ for i in [a-c]*; do echo "--- " $i ; done
---  aaa
---  bbb
---  ccc
  

Это можно сделать с помощью for . Но, может быть, есть способ сделать это короче? Может быть, например, использовать двойные фигурные скобки вокруг глобуса или что-то еще?

Спасибо. 🙂

Ответ №1:

Возможно, вы ищете zargs команду с той же целью, xargs но с более разумным интерфейсом.

 autoload -U zargs
zargs -n 1 -- * -- mycommand
  

Ответ №2:

printf Команда будет неявно зацикливаться, если в строке формата задано больше аргументов, чем заполнителей:

 printf -- "--- %sn"  [a-c]*
  

Чтобы выполнить команду для каждого файла, вам нужно xargs : Я предполагаю, что у вас есть GNU xargs, у которого есть -0 опция:

 printf "%s" [a-c]* | xargs -0 -I FILE echo aa FILE bb
  

Замените команду echo xargs на все, что вам нужно, используя заполнитель «FILE», где вам нужно имя файла.

Используйте свое собственное суждение, чтобы определить, действительно ли это лучше или более ремонтопригодно, чем цикл for .

Комментарии:

1. О, спасибо, спасибо. Но на самом деле echo был просто примером. Фактическая команда, которую я хочу выполнить, — «psql … -f $ i» 🙂