Linux shell 中的簡單命令列循環

Linux shell 中的簡單命令列循環

我在build名為的資料夾的 4 個子資料夾中具有相同名稱的檔案:

  • 發布-iphoneos
  • 發布-iphone模擬器
  • 調試-iphoneos
  • 調試-iphone模擬器

我想sdk在命令列上將這些文件複製到資料夾中的相同目錄結構 - 但不使用腳本。

我認為我應該能夠做的是這樣的:

for C in (release debug); for T in (iphoneos iphonesimulator); cp build/$C-$T/*.a sdk/$C-$T

但我不是 Linux 人員,即使在查找循環之後我也無法讓它工作。可以很容易地在一條線上完成嗎?

答案1

您的方法有幾個問題:

  • (A B)只能用於陣列賦值(例如,C=(A B)),不能即時建立一個。

    然而,為了不需要數組,所以for C in A B可以正常工作。

  • 循環的正確語法forfor ... in ...; do ..., done.

這個指令應該可以正常運作:

for C in release debug; do for T in iphoneos iphonesimulator; do cp build/$C-$T/*.a sdk/$C-$T; done; done

請注意,這需要正確的資料夾開發工具包已經存在了。

然而,正如 @Robertof 已經表明的那樣,有一些方法可以在沒有任何循環的情況下對其進行存檔。


如果你想複製全部目錄中的檔案(即*.a符合所有檔案),您可以使用他的命令或這個稍微簡化的命令:

cp -R build/{release,debug}-iphone{os,simulator} sdk

怎麼運作的:

  • shell將執行大括號擴展,所以實際執行的命令是:

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • -r開關使CP遞歸,即它將複製整個目錄而不僅僅是文件。


如果您只想複製`文件(即還有其他文件),您最好使用這些命令:

cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk

怎麼運作的:

  • 再次,像以前一樣執行大括號擴展。

  • --parents開關使CP使用完整的來源檔案名稱作為目標,即檔案 fromrelease-iphoneos將被複製到../sdk/release-iphoneos.


最後,一句忠告:

嘗試時CP命令,始終使用-i開關。它使CP互動式,這意味著它會在覆蓋任何內容之前進行提示。

答案2

嘗試:

cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/

相關內容