생성된 패턴에 대해 사용 가능한 다음 파일 이름(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"

관련 정보