以下のコマンドを実行する必要があります。
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 に設定されていないか、*.zip
POSIX シェルでグロービング式とその両方が使用されない限り、そうではありません。.*.zip
詳細と注意:
あるディレクトリから別のディレクトリにすべてのファイル(隠しファイルを含む)を移動するには?。
答え2
何千ものファイルがないと仮定すると(「パラメータリストが長すぎます」エラーが発生した場合)、シェルを使用して次のことができますzsh
。
mycli ./*.zip(P:--file:)
または、bash
シェルで次の操作を行います。
zsh -c 'exec mycli ./*.zip(P:--file:)'
(ここでは効率のためにシェルの代わりにexec
プロセスを使用しています。)zsh
mycli
ファイル名globbing修飾子は、globが拡張される各要素の前にP
指定された文字列(here)を別々の単語として追加します。--file
隠しファイルを含めるにはD
beforeを追加し、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
結果のコマンドに満足したら、echo
2番目のコマンドを削除してxargs
やり直してください。
zipファイル名にスペースやその他のシェルメタ文字が含まれていると、状況がより複雑になります。