我在名为以下文件夹的 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
可以正常工作。循环的正确语法
for
是for ... 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/