Bucle de línea de comandos simple en el shell de Linux

Bucle de línea de comandos simple en el shell de Linux

Tengo archivos con nombres idénticos en 4 subcarpetas de la carpeta buildllamada:

  • 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 Bfuncionará bien.

  • La sintaxis adecuada para forlos bucles es for ... 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, *.acoincide 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 -rinterruptor 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 --parentsinterruptor haceCPutilice el nombre completo del archivo de origen para el destino, es decir, los archivos de release-iphoneosse copiarán a ../sdk/release-iphoneos.


Finalmente, un consejo:

Al experimentar conCPcomandos, utilice siempre el -iinterruptor. 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/

información relacionada