ディレクトリ内のファイルをループしてパスを変更し、ファイル名にサフィックスを追加する方法 質問する

ディレクトリ内のファイルをループしてパスを変更し、ファイル名にサフィックスを追加する方法 質問する

異なる引数でプログラムを開始するスクリプトを作成する必要があります。次のようにプログラムを開始します。

./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]

私がやりたいことの疑似コードは次のとおりです。

for each filename in /Data do
  for int i = 0, i = 3, i++
    ./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
  end for
end for

最初の引数から 2 番目の引数を作成して、 dataABCD_Log1.txtのようにし、プログラムを起動するにはどうすればよいでしょうか?

ベストアンサー1

まず、いくつか注意点があります。Data/data1.txtを引数として使用する場合、本当に (先頭にスラッシュを付けて) とすべきでしょうか? また、外側のループは .txt ファイルのみをスキャンすべきでしょうか、それとも /Data 内のすべてのファイルをスキャンすべきでしょうか? .txt ファイルのみを/Data/data1.txtスキャンすると仮定した場合の答えは次のとおりです。/Data/data1.txt

#!/bin/bash
for filename in /Data/*.txt; do
    for ((i=0; i<=3; i++)); do
        ./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
    done
done

ノート:

  • /Data/*.txt/Data 内のテキスト ファイルのパスに展開されます ( /Data/ 部分を含む)
  • $( ... )シェルコマンドを実行し、その出力をコマンドラインのその位置に挿入します。
  • basename somepath .txt末尾の .txt を削除した somepath のベース部分を出力します (例: /Data/file.txt-> file)

Data/file.txtの代わりに MyProgram を実行する必要がある場合は/Data/file.txt、 を使用して"${filename#/}"先頭のスラッシュを削除します。一方、スキャンしたくないData場合は、 を使用します。/Datafor filename in Data/*.txt

おすすめ記事