2017-01-09 2 views
0

シェル関数(zsh)mexecを追加して、すべての直下のサブディレクトリで同じコマンドを実行しようとしています。次の構造直下のすべてのサブディレクトリでコマンドを実行

~ 
-- folder1 
-- folder2 

mexec pwdと私はすぐにサブディレクトリを引っ張ってfindを使用してい

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

例えば表示されるでしょう。問題は、渡されたコマンドを実行することです。ここに私の最初の関数のdefintionです:

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

のみコマンド自体を実行しますが、引数に渡していないだけでmexec lsが、ショーのためのmexec作品、mexec ls -al/bin/zsh -c "(cd {} && [email protected]);"第2ラインを変更する正確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に渡す方法に問題があると私に思い出させてくれます。これはまた、私がbashを使用すると問題になるようです:表示されるエラーは:

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

これを達成するにはどうすればよいでしょうか?

答えて

2

あなたがコマンドを実行するために、サブシェルを開き

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

(cmd1 && cmd2)、深い1つのレベルですべてのサブディレクトリにループし、その上でコマンドを実行この単純なループを使用して試すことができます。これは子シェルなので、親シェル(このコマンドを実行しているシェル)は現在のフォルダーと他の環境変数を保持します。

#!/bin/zsh 

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

runCommand "ls -al" 

として適切zshスクリプト内の関数でそれを周りにラップはあなたのためにうまく動作するはずです。

+0

この場合、 'ls -al'はすべてのサブディレクトリで実行されているコマンドの例です。私は、どのコマンドを使用しているかにかかわらず、フリーフォームにしたいと思っています。 forループを試してみましょう。 – Zahymaka

+0

@Zahymaka:関数を追加することでこれを行う一般的な方法を追加しました。あなたがあなたの問題を解決したら、それを受け入れる/ upvoteを忘れないでください。 – Inian

+1

ディレクトリ名に引用符がある場合(zsh:1:不一致) – 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

2つのエコーはハックです。なぜ、-eが最初のもので動作しないのか分かりません。 – wilsotc

+1

私は 'mexec 'ls -al''というコマンドを引用符で囲んで、私のオリジナルの作品を実現しました。そうです。ありがとう! – Zahymaka

関連する問題