1. ホーム
  2. bash

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

2022-03-14 21:02:08

質問

異なる引数でプログラムを開始するスクリプトを書く必要があるのですが、Bashは初めてなんです。私は私のプログラムを次のように開始します。

./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のように見えるようにして、プログラムを開始する方法に本当に困惑しているのです。

どのように解決するのですか?

まず、いくつかの注意点があります。 Data/data1.txt を引数として指定する必要があります。 /Data/data1.txt (先頭にスラッシュをつける)? また、外側のループは.txtファイルのみをスキャンするべきでしょうか、それとも/Dataにあるすべてのファイルをスキャンするべきでしょうか?以下は、次のように仮定した場合の答えです。 /Data/data1.txt と.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 は、somepath のベース部分を出力し、末尾から .txt を削除します (例. /Data/file.txt -> file )

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