私はシェルスクリプトに初めて触れて助けを探しています。
2つのパラメータ入力ファイル名と出力ファイル名を受け入れるプログラムがあります。
名前の異なるデータファイルが複数あります。各ファイルが個別に処理されるように、すべてのデータファイルでこのプログラムを実行するシェルスクリプトを作成したいと思います。
-s
各出力ファイルの名前はソリューションファイルであることを示すために入力ファイルの名前でなければなりません。ただし、-s
名前の基本部分を追加する必要があるので、にfile.txt
なりますfile-s.txt
。
編集:同様の質問をしたすべての回答者に感謝します。ここ 違いは、私がMS VSを使用していないか、C ++コードに問題があり、すべてのデータ(何千もの.txtファイル)を私のワークステーションで同時に処理したいということです。
答え1
GNU Parallel
プログラムを使用してこれを行うことができます。
find . -name \*.txt | grep -v -e '\-s.txt$' | parallel echo program "{}" {.}-s.txt
program ./1 2.txt ./1 2-s.txt
program ./aaa.txt ./aaa-s.txt
program ./bbb.txt ./bbb-s.txt
program ./demo.txt ./demo-s.txt
program ./original_names.txt ./original_names-s.txt
答え2
次のようなものが欲しいようです。
for src; do
dst="${src%.txt}-s.txt"
program "$src" "$dst"
done
処理するファイル名でスクリプトを呼び出します。重要な部分は拡張子を"${src%.txt}-s.txt"
削除します。.txt
-s.txt
答え3
現在、2つの引数を使用してプログラムを呼び出すと仮定すると、cmd input-file output-file
ラッパースクリプトを次のように簡単に作成できます。
#!/bin/sh
for file; do
output="${file%.txt}"-s.txt
cmd "$file" "$output" &
done
次に、複数の入力を引数として使用してスクリプトを呼び出します。この解決策は、入力ファイルがすべて.txt
サフィックスを持っていると仮定します(実際にはそうではないと仮定しますが、そうでない場合は出力ファイル名が奇妙になります)。これにより、既存の出力ファイルが上書きされる可能性があることに注意してください。懸念がある場合は、以前の存在を確認するいくつかのロジックを追加してください。この問題を回避するには、ディレクトリを作成し、すべての出力ファイルを新しいディレクトリに配置する方が安全です。または、入力からファイル名を読み取るには(たとえば、呼び出しスクリプトを使用できます< my-file-full-of-input-files-one-per-line ./my-script
)、次のように作成します。
#!/bin/sh
while read file; do
output="${file%.txt}"-s.txt
cmd "$file" "$output" &
done