2017-01-09 72 views
0

我試圖添加一個shell函數(zsh)mexec以在所有直接子目錄中執行相同的命令,例如具有下列結構在所有直接子目錄中執行命令

~ 
-- folder1 
-- folder2 

mexec pwd將顯示例如

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

我使用find拉立即子目錄。問題是讓傳入的命令執行。這是我的第一個函數確定指標:

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。這也似乎如果我使用bash是一個問題:顯示的錯誤是:

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

什麼是實現這一目標的好方法?

回答

2

你可以嘗試使用這個簡單的循環,其循環中所有子目錄的一級且在其上執行命令,

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

(cmd1 && cmd2)打開一個子shell來運行命令。由於它是一個子shell,所以父shell(從中運行此命令的shell)將保留其當前文件夾和其他環境變量。

繞到它的功能在適當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

這兩個回聲是一個黑客。不知道爲什麼-e不會在第一個上工作。 – wilsotc

+1

如果我用引號引用'mexec'ls -al''命令,我才意識到我的原創作品。這樣做。謝謝! – Zahymaka

相關問題