Bashスクリプトはディレクトリ内のすべてのファイルを読み取り、コマンドライン引数に使用する文字列にファイル名を追加します。

Bashスクリプトはディレクトリ内のすべてのファイルを読み取り、コマンドライン引数に使用する文字列にファイル名を追加します。

以下を実行するbashスクリプトがあります。

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input file1.dat file2.dat file3.dat (etc)

次のように、ディレクトリ内のすべてのファイルを読み取ることができます。

dir=~/location/to/files
for f in "$dir"/*; do
   echo "$f"
done

上記のテストはすべてのファイルを示しています。これにより、一度に1つのファイルを$ fに入れることができます。ただし、各ファイル名文字列(私が信じるパスを含む)を次のように使用できる変数に関連付ける必要があります(おそらくそのループ内)。

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input $listOfFileNamesWithSpaceBetweenEachFile 私は私の人生でこのようなものを見つけることができません。誰でもどんな提案がありますか?

ありがとうございます。

修正する 会話をした後、私が少し間違っていたことがわかりました。次のようにする必要があります。

-- input /path/to/filename1.gpx --input /path/to/filename2.gpx --input /path/to/filename3.gpx etc

だから私は次のように文字列を得ることができます:

VAR=""
dir=~/location/to/files
for f in "$dir"/*; do
    echo ${f}
    VAR+="--input ${f} "
done
`

みんなの助けをありがとう!

ベストアンサー1

シェルコマンドラインでこのコマンドを実行する場合:

somecommand --input file1.dat file2.dat file3.dat 

これにより、somecommand4つのパラメータ--inputと3つのファイル名が表示されます。あなたも同じことができます。

somecommand --input file*.dat

globは、file*.datそれぞれ別々の引数を持つファイル名のリストに展開されますsomecommand

だから、

java ... --input ~/location/to/files/*

それがあなたがしなければならないすべてであるかもしれません。


このような変数をvar="foo.txt bar.txt"引用符なしで使用して不都合なリストとして使用できるようになりましたが、一部のファイル名にスペースが含まれているか悪い場合に問題が発生する可能性があります。

代わりに配列を使用してください。

files=(foo.txt bar.txt)
somecommand --input "${files[@]}"

または

files=(foo*.txt) # expands each filename to a distinct array element.
somecommand --input "${files[@]}"

バラより変数に保存されたコマンドをどのように実行できますか?追加の詳細が含まれています。徐々に配列を構築します。


編集では、--input file1 --input file2 ...パラメータを含むコマンドラインオプションがどのように機能するかなど、コマンドを変更する必要があると述べました。

この場合、次のように配列にパラメータを作成する必要があります。

args=()
dir=~/location/to/files
for f in "$dir"/*; do
   args+=(--input "$f")
done

そしてもう一度コマンドを実行してみてください

somecommand ... "${args[@]}"

おすすめ記事