Loop de linha de comando simples no shell do Linux

Loop de linha de comando simples no shell do Linux

Nomeei arquivos de forma idêntica em 4 subpastas da pasta buildchamada:

  • lançamento-iphoneos
  • simulador de lançamento de iphone
  • debug-iphoneos
  • simulador de depuração de iPhone

Quero copiar esses arquivos para uma estrutura de diretórios idêntica em uma pasta sdk, na linha de comando - mas não usando um script.

O que pensei que deveria ser capaz de fazer é algo como:

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

Mas não sou um cara do Linux e não consigo fazê-lo funcionar mesmo depois de procurar loops. Isso pode ser feito em uma única linha com bastante facilidade?

Responder1

Existem alguns problemas com sua abordagem:

  • (A B)só pode ser usado para atribuição de array (por exemplo, C=(A B)), não para criar um instantaneamente.

    No entanto,paranão requer uma matriz, então for C in A Bfuncionará perfeitamente.

  • A sintaxe adequada para forloops é for ... in ...; do ..., done.

Este comando deve funcionar bem:

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

Observe que isso requer as pastas adequadas emSDKjá existir.

Porém, como @Robertof já mostrou, existem maneiras de arquivar isso sem nenhum loop.


Se você quiser copiartodosarquivos dos diretórios (ou seja, *.acorresponde a todos eles), você pode usar o comando dele ou esta ligeira simplificação:

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

Como funciona:

  • O shell irá executarexpansão de cinta, então o comando que será realmente executado é este:

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • A -rmudança fazCPrecursivo, ou seja, copiará diretórios inteiros em vez de apenas arquivos.


Se você quiser copiar apenas o `.aarquivos (ou seja, existem outros), é melhor usar estes comandos:

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

Como funciona:

  • Novamente, a expansão das chaves é executada como antes.

  • A --parentsmudança fazCPuse o nome completo do arquivo de origem para o destino, ou seja, os arquivos de release-iphoneosserão copiados para ../sdk/release-iphoneos.


Por fim, um conselho:

Ao experimentarCPcomandos, sempre use o -iswitch. Isso fazCPinterativo, o que significa que ele avisará antes de substituir qualquer coisa.

Responder2

Tentar:

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

informação relacionada