Loop de linha de comando simples no shell do Linux

0

Eu identifiquei arquivos com nomes idênticos em 4 subpastas da pasta build named:

  • release-iphoneos
  • release-iphonesimulator
  • debug-iphoneos
  • debug-iphonesimulator

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

O que eu pensei que eu 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 eu não sou um cara do Linux e não consigo fazer isso funcionar mesmo depois de procurar por loops. Pode ser feito em uma única linha com bastante facilidade?

    
por Mr. Boy 08.03.2014 / 13:32

2 respostas

2

Existem alguns problemas com sua abordagem:

  • (A B) só pode ser usado para atribuição de matriz (por exemplo, C=(A B) ), não criando uma operação imediata.

    No entanto, para não requer um array, então for C in A B funcionará bem.

  • A sintaxe apropriada para for loops é 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

Note que isto requer que as pastas apropriadas em sdk já existam.

No entanto, como o @Robertof já mostrou, existem maneiras de arquivar isso sem nenhum loop.

Se você quiser copiar todos os arquivos dos diretórios (ou seja, *.a corresponde a todos eles), você pode usar o comando ou esta pequena simplificação:

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

Como funciona:

  • O shell executará expansão de brace , 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 opção -r torna o cp recursivo, ou seja, copiará diretórios inteiros em vez de apenas arquivos.

Se você deseja copiar somente os arquivos ' .a (ou seja, há outros), é melhor usar esses comandos:

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

Como funciona:

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

  • A opção --parents faz com que cp use o nome completo do arquivo de origem para o destino, ou seja, os arquivos de release-iphoneos serão copiados para ../sdk/release-iphoneos .

Finalmente, uma palavra de conselho:

Ao experimentar com comandos cp , use sempre a opção -i . Isso torna o cp interativo, o que significa que ele será avisado antes de sobrescrever qualquer coisa.

    
por 08.03.2014 / 14:11
2

Tente:

cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/
    
por 08.03.2014 / 13:43