2017-01-09 4 views
0

Я пытаюсь добавить функцию оболочки (zsh) mexec для выполнения той же команды во всех непосредственных подкаталогах, например. со следующей структуройВыполнение команды во всех ближайших подкаталогах

~ 
-- folder1 
-- folder2 

mexec pwd показать бы, например

/home/me/folder1 
/home/me/folder2 

Я использую find тянуть непосредственные подкаталоги. Проблема заключается в том, что команда передается в команде. Вот моя первая функция Defintion:

mexec() { 
    find . -mindepth 1 -maxdepth 1 -type d | xargs -I'{}' \ 
    /bin/zsh -c "cd {} && [email protected];"; 
} 

выполняет только саму команду, но не проходит в аргументах, т.е. mexec ls -al ведет себя так же, как ls

Изменение второй строки в /bin/zsh -c "(cd {} && [email protected]);", mexec работы для всего mexec ls но показывает эта ошибка для mexec ls -al:

zsh:1: parse error near `ls' 

Идя EXEC маршрут с найти

find . -mindepth 1 -maxdepth 1 -type d -exec /bin/zsh -c "(cd {} && [email protected])" \; 

Дает мне то же самое, что заставляет меня думать, что есть проблема с тем, как я передаю аргументы zsh. Это также, как представляется, проблема, если я использую Баш: приведенная ошибка:

-a);: -c: line 1: syntax error: unexpected end of file 

Что бы быть хорошим способом для достижения этой цели?

ответ

2

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

for d in ./*/ ; do (cd "$d" && ls -al); done 

(cmd1 && cmd2) открывает подоболочку для выполнения команд. Поскольку это дочерняя оболочка, родительская оболочка (оболочка, из которой вы используете эту команду) сохраняет свою текущую папку и другие переменные среды.

Оберните его вокруг в функции в надлежащем zsh сценарии, как

#!/bin/zsh 

function runCommand() { 
    for d in ./*/ ; do /bin/zsh -c "(cd "$d" && "[email protected]")"; done 
} 

runCommand "ls -al" 

должна хорошо работать для вас.

+0

'ls -al' в этом случае является лишь примерной командой, которую я запускаю в каждом подкаталоге. Я бы хотел, чтобы это была свободная форма, независимо от того, какую команду я использую. Я попробую цикл for. – Zahymaka

+0

@ Zahymaka: Я добавил более общий способ сделать это, добавив функцию. Не забывайте принимать/повышать его, как только вы находите решение проблемы. – Inian

+1

Эта функция не работает, если в названии каталога есть цитата (zsh: 1: unmatched ') – wilsotc

1
#!/bin/zsh 
# A simple script with a function... 

mexec() 
{ 
    export [email protected] 
    find . -type d -maxdepth 1 -mindepth 1 -print0 | xargs -0 -I{} zsh -c 'cd "{}" && echo "{}" && echo "$('$THE_COMMAND')" && echo -e' 
} 

mexec ls -al 
+0

Этот должен работать даже с каталогами с кавычками и другими странными символами. – wilsotc

+0

Два эха - это взлом. Не знаю, почему-бы не работать на первом. – wilsotc

+1

Я только что понял свои оригинальные работы, если я назвал 'mexec 'ls -al'' командой в кавычках. Так и получается. Благодаря! – Zahymaka

Смежные вопросы