Linux シェルでのシンプルなコマンドライン ループ

Linux シェルでのシンプルなコマンドライン ループ

次の名前のフォルダの 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 行で簡単に実行できますか?

答え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

これには適切なフォルダが必要であることに注意してくださいSDKすでに存在している。

ただし、@Robertof がすでに示したように、ループなしでこれをアーカイブする方法はあります。


コピーしたい場合全てディレクトリからファイルを検索する場合 (つまり、*.aすべてに一致する場合)、このコマンドを使用するか、または少し簡略化した次のコマンドを使用できます。

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

使い方:

  • シェルは実行しますブレース拡張したがって、実際に実行されるコマンドは次のようになります。

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • スイッチ-rcp再帰的、つまり、ファイルだけではなくディレクトリ全体をコピーします。


`だけをコピーしたい場合は、.aファイルがある場合(つまり、他にもファイルがある場合)、次のコマンドを使用する方が適切です。

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

使い方:

  • ここでも、前と同じようにブレース拡張が実行されます。

  • スイッチ--parentscp宛先には完全なソースファイル名を使用します。つまり、 のファイルはrelease-iphoneosにコピーされます../sdk/release-iphoneos


最後に、アドバイスを一つ。

実験するときcpコマンドを実行するときは、必ず-iスイッチを使用してください。cp対話型なので、何かを上書きする前にプロンプ​​トが表示されます。

答え2

試す:

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

関連情報