生成されたパターンに使用可能な次のファイル名(02-output.logなど)

生成されたパターンに使用可能な次のファイル名(02-output.logなど)

mktemp(1)シェルスクリプトでこれを使用して、適切なサフィックスとプレフィックスがあるディレクトリに一時ファイルを作成できます。

パターン(例えばNN-output.log)が与えられた場合、そのパターンを見つけて存在する場合(または利用可能な次の番号)を返す01-output.logコマンドはありますか?02-output.logスクリプトに直接コマンドを記述することなく、「次の使用可能な連続ファイル名を取得する」コマンドが必要です。

一意の増分ファイル名を取得するために、または同様のものを使用できることを知っていますが、date -Isecondsより単純な増分ファイル名を生成できるものはありますか?

このようなプログラムを書くのは簡単ですが、自分で書く前に誰かがすでに書いていることを確認したいと思います。

修正する誰かが「スクリプトがどのようにパターンを知ることができますか?」と尋ねると、mktempのようにプログラムにパターンを提供しながら提案しました。たとえば、「output-XX.logという名前の次のファイルを与える」プログラムは、Xを見てそれを埋め、01ファイルを見つけるなどの操作を実行します。

ベストアンサー1

少なくともkshとbashで動作するシェル機能は次のとおりです。コメントが示すように、この特定の質問で予想される入力パターンはハードコードされています。つまり、フォーマットは「XX」(2つのXで表される)の後に質問で提案するように(何か)ではありません。 。

スクリプトはパラメータ拡張を使用して前のXXを削除し、後で追加されたインデックスに再n構成できるように保存します。その後、1から99まで繰り返し、必要に応じて数字を0で埋め、対応するファイルが[ ! -f ... ]存在しないことを確認します。存在しない場合はファイル名を印刷し、return 0成功すると()を返します。利用可能なファイルを見つけずにループを終了すると、>&2stderr()にメッセージを印刷します。何もないstdoutに送信し、失敗戻りコード(return 1)を返します。

# hard-coded to expect an input pattern of XX(something)
function rmktemp {
  pattern=$1
  suffix=${pattern#XX}
  n=1
  while [ $n -lt 100 ]
  do
    if [ $n -lt 10 ]
    then
      n="0${n}"
    fi
    tfile="${n}${suffix}"
    if [ ! -f "$tfile" ]
    then
      printf "%s\n" "$tfile"
      return 0
    fi
    n=$((n+1))
  done
  if [ $n -eq 100 ]
  then
    echo Could not find an unused file >&2
    return 1
  fi
}

次のように使用してください。

LOG=$(rmktemp XX-output.log)
[ $? -eq 0 ] && echo stuff > "$LOG"

おすすめ記事