Linux shell 中的简单命令行循环

Linux shell 中的简单命令行循环

我在名为以下文件夹的 4 个子文件夹中有同名的文件build

  • 发布-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递归,即它将复制整个目录而不仅仅是文件。


如果您只想复制`。A文件(即还有其他文件),最好使用以下命令:

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

怎么运行的:

  • 再次,像以前一样执行括号扩展。

  • 开关--parents使cp使用完整的源文件名作为目标,即,文件将从release-iphoneos复制到../sdk/release-iphoneos


最后,给大家一个建议:

在尝试cp命令,请始终使用-i开关。它使cp交互式,这意味着它会在覆盖任何内容之前进行提示。

答案2

尝试:

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

相关内容