
Tengo archivos con nombres idénticos en 4 subcarpetas de la carpeta build
llamada:
- lanzamiento-iphoneos
- simulador de lanzamiento de iPhone
- depurar-iphoneos
- simulador de depuración de iPhone
Quiero copiar estos archivos a una estructura de directorio idéntica en una carpeta sdk
, en la línea de comandos, pero sin utilizar un script.
Lo que pensé que debería poder hacer es algo como:
for C in (release debug); for T in (iphoneos iphonesimulator); cp build/$C-$T/*.a sdk/$C-$T
Pero no soy un aficionado a Linux y no puedo hacerlo funcionar incluso después de buscar bucles. ¿Se puede hacer en una sola línea con bastante facilidad?
Respuesta1
Hay un par de problemas con su enfoque:
(A B)
sólo se puede utilizar para la asignación de matrices (por ejemplo,C=(A B)
), no para crear una sobre la marcha.Sin embargo,paraNo requiere una matriz, por lo que
for C in A B
funcionará bien.La sintaxis adecuada para
for
los bucles esfor ... in ...; do ..., done
.
Este comando debería funcionar bien:
for C in release debug; do for T in iphoneos iphonesimulator; do cp build/$C-$T/*.a sdk/$C-$T; done; done
Tenga en cuenta que esto requiere las carpetas adecuadas enSDKexistir ya.
Sin embargo, como ya mostró @Robertof, hay formas de archivar esto sin ningún bucle.
Si quieres copiartodoarchivos de los directorios (es decir, *.a
coincide con todos ellos), puede usar su comando o esta ligera simplificación:
cp -R build/{release,debug}-iphone{os,simulator} sdk
Cómo funciona:
El caparazón funcionaráexpansión de corsé, por lo que el comando que realmente se ejecutará es este:
cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
El
-r
interruptor haceCPrecursivo, es decir, copiará directorios completos en lugar de sólo archivos.
Si desea copiar sólo el `.aarchivos (es decir, hay otros), es mejor que utilices estos comandos:
cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk
Cómo funciona:
Nuevamente, la expansión del aparato ortopédico se realiza como antes.
El
--parents
interruptor haceCPutilice el nombre completo del archivo de origen para el destino, es decir, los archivos derelease-iphoneos
se copiarán a../sdk/release-iphoneos
.
Finalmente, un consejo:
Al experimentar conCPcomandos, utilice siempre el -i
interruptor. Eso haceCPinteractivo, lo que significa que avisará antes de sobrescribir cualquier cosa.
Respuesta2
Intentar:
cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/