2017-06-07 51 views
1

我想將可執行文件從一個目錄複製到另一個目錄。僅複製可執行文件(跨平臺)

源目錄包括我不關心的各種文件(構建工件)。我想只抓取可執行文件,使用可在OS X和Linux上運行的bash腳本。

通過可執行文件,我的意思是一個文件具有可執行權限,並且會通過test -x $filename

我知道我可以編寫一些python腳本,但然後我會介紹python的依賴(只是爲了複製文件!),這是我真正想避免的。

注:我似乎有幾個類似的問題,但答案似乎只適用於Linux(如專門問到Linux的問題)。請不要將其標記爲重複,除非重複問題確實只涉及跨平臺複製可執行文件。

+0

另請參見https://stackoverflow.com/a/4458361/2908724 – bishop

回答

2

Your own answer是概念上優雅,但速度慢,因爲它爲每一個輸入文件(test)至少創建了一個子進程,外加一個用於每個匹配文件(cp)。

這裏的一個更高效bash替代在於:

  • 積聚在殼代碼匹配輸入文件的陣列,他們使用調用的cp
  • 然後拷貝。
#!/usr/bin/env bash 

exeFiles=() 
for f in "$src_dir"/*; do [[ -x $f && -f $f ]] && exeFiles+=("$f"); done 
cp "${exeFiles[@]}" "$dest_dir/" 
  • exeFiles=()初始化在其中存儲匹配的文件名的陣列。
  • for f in "$src_dir"/*遍歷直接位於$scr_dir的所有文件和目錄;請注意0​​必須爲未加引號以進行通配符(文件名擴展)。
    • [[ -x $f && -f $f ]]確定手邊的物品是否可執行(-x)和(常規)文件-f;請注意,在[[ ... ]]內雙引號變量引用(大部分)是可選的。
    • exeFiles+=("$f")追加一個新的元素到所述陣列
  • "${exeFiles[@]}"是指所得到的陣列作爲一個整體,魯棒擴展到數組元素作爲單獨的參數 - 見Bash arrays
2

一些實驗後,這似乎在兩個OS X的工作和Ubuntu

find "$src_dir" -maxdepth 1 -type f -exec test -x {} \; -exec cp {} "$dest_dir/" \; 

注意,-maxdepth 1特定於我的使用情況下,我不關心通過所有的目錄大約遞歸去。

-type f是必要的,因爲目錄也算可執行

我傳遞了兩個-exec標誌。 exec標誌不僅執行該命令,而且還計算爲過濾器,以便如果該命令返回非零退出代碼,則會將該文件過濾掉。

使用EXEC的方式是寫出來的任何命令你想要的,使用{}提供當前文件,並與\;

第一-exec只返回如果該文件是可執行的成功退出代碼終止。

第二個-exec執行復制,但如果第一個-exec失敗,則不會執行該複製。