2017-06-07 6 views
1

あるディレクトリから別のディレクトリに実行可能ファイルをコピーしたい。実行可能ファイルのみをコピーする(クロスプラットフォーム)

ソースディレクトリには、気にしないすべての種類のファイル(ビルド成果物)が含まれています。 OS XとLinuxの両方で動作するbashスクリプトを使用して、実行可能ファイルのみを取得したい。

実行可能ファイルとは、実行可能なアクセス許可を持つファイルを意味し、test -x $filenameを渡します。

私はいくつかのpythonスクリプトを書くことができますが、私は本当に避けたいものですpython(単にファイルをコピーする!)に依存して導入されます知っている。

注:似たような質問がいくつか出てきましたが、答えはLinuxでのみ動作するようです(特にLinuxに関する質問として)。重複した質問が実際に実行可能ファイルのみのクロスプラットフォームコピーに関するものでない限り、これを重複としてマークしないでください。

+0

https://stackoverflow.com/a/4458361/2908724も参照してください。 – bishop

答えて

2

Your own answerは、概念的にエレガントな、しかし遅いです。 、彼らはcp単一呼び出しを使用して

  • してからコピー

    • は、シェルコードで入力ファイルを一致させる配列を構築:

      はここbash、より効率的な代替です。

    #!/usr/bin/env bash 
    
    exeFiles=() 
    for f in "$src_dir"/*; do [[ -x $f && -f $f ]] && exeFiles+=("$f"); done 
    cp "${exeFiles[@]}" "$dest_dir/" 
    
    • exeFiles=()一致するファイル名を格納するする配列を初期化します。
    • for f in "$src_dir"/*$scr_dirに直接置かれたすべてのファイルとディレクトリに対するループ。 note *は、である必要があります。は、グロビング(ファイル名展開)が発生するためのものです。
      • [[ -x $f && -f $f ]]手でアイテムが実行可能(-x)及び(レギュラー)ファイル-fであるか否かを判断します。 [[ ... ]]の二重引用符で囲まれた変数参照は(ほとんど)オプションであることに注意してください。
      • exeFiles+=("$f")アレイ
    • "${exeFiles[@]}"に新しい要素を追加し、全体としての結果の配列を意味し、ロバスト個々の引数としての配列要素に展開 - Bash arrays参照します。
  • 2

    いくつかの実験をした後、これは-maxdepth 1は私が再帰的にすべてのディレクトリを経由する気にしない、私の使用の場合に特異的であることを注意

    find "$src_dir" -maxdepth 1 -type f -exec test -x {} \; -exec cp {} "$dest_dir/" \; 
    

    OS XとUbuntuの両方で動作するようです。ディレクトリはまた、私は2つの -execフラグを渡す実行可能

    としてカウントするので

    -type fが必要です。 execフラグはコマンドを実行するだけでなく、フィルターとしてカウントするので、コマンドがゼロ以外の終了コードを返した場合、ファイルは除外されます。

    のexecを使用する方法は、何でもしたいコマンドを書き出す現在のファイルを供給する{}を使用し、\;

    最初-exec戻っファイルが実行可能である場合にのみ、成功の終了コードで終了です。

    第2の-execがコピーを実行しますが、最初に-execが失敗した場合は実行されません。それはすべての入力ファイル(test)、プラス各一致ファイル(cp)のための追加のいずれかの少なくとも一つの子プロセスが作成されるため

    関連する問題