ディレクトリ内のすべてのファイルをcliパラメータとして追加する

ディレクトリ内のすべてのファイルをcliパラメータとして追加する

以下のコマンドを実行する必要があります。

mycli --file test.zip --file another_test.zip

ディレクトリ内のすべてのzipファイルを動的に実行するにはどうすればよいですか? findコマンドでファイルを転送できると確信していますが、そのファイルを他のコマンドに引数として追加する方法がわからないので、bash-fuはお勧めできません。

答え1

配列を使用して下さい:

unset -v args
declare -a args
for file in *.zip
do
  args+=( --file "$file" )
done
mycli "${args[@]}"

またはPOSIXとして:

set --
for file in *.zip
do
  set -- "$@" --file "$file"
done
mycli "$@"

または、GNUツールを想定すると、次のようになります。

find . -maxdepth 1 -name '*.zip' -printf '--file\0%f\0' |
  xargs -0 -- mycli

配列ベースの方法と配列ベースの方法xargsの関連の違い:前者は次のように失敗する可能性があります。「パラメータリストが長すぎます」エラー(組み込みコマンドではないと仮定)、後者は何度もmycli実行されず、実行されます。mycliただし、最後の場合は、最後の呼び出しの1つを除くすべてのパラメータのリストが次に終わることが--fileあります(次のパラメータのリストはファイル名で始まります)。ユースケースに応じて、xargs「オプション(など-n-x」を組み合わせることで、これが発生しないようにすることができます。

またfind含まれます。隠しファイル一方、配列ベースの選択肢は、dotglobシェルオプションが Bash に設定されていないか、*.zipPOSIX シェルでグロービング式とその両方が使用されない限り、そうではありません。.*.zip詳細と注意: あるディレクトリから別のディレクトリにすべてのファイル(隠しファイルを含む)を移動するには?

答え2

何千ものファイルがないと仮定すると(「パラメータリストが長すぎます」エラーが発生した場合)、シェルを使用して次のことができますzsh

mycli ./*.zip(P:--file:)

または、bashシェルで次の操作を行います。

zsh -c 'exec mycli ./*.zip(P:--file:)'

(ここでは効率のためにシェルの代わりにexecプロセスを使用しています。)zshmycli

ファイル名globbing修飾子は、globが拡張される各要素の前にP指定された文字列(here)を別々の単語として追加します。--file

隠しファイルを含めるにはDbeforeを追加し、P通常のファイルのみを一致するように制限するには、次を追加します.

zsh -c 'exec mycli ./*.zip(.DP:--file:)'

サブディレクトリへの再帰の場合:

zsh -c 'exec mycli ./**/*.zip(.DP:--file:)'

...修正タイムスタンプ(優先)、omファイルを追加した方法D.以前に追加した方法の順にファイルを並べ替えます。

答え3

これは働きます:

ls *.zip | xargs printf "--file %s " | xargs echo mycli

結果のコマンドに満足したら、echo2番目のコマンドを削除してxargsやり直してください。

zipファイル名にスペースやその他のシェルメタ文字が含まれていると、状況がより複雑になります。

関連情報