명령 행 : 파일 이름이 이미 존재하는 경우 새 파일 이름으로 파일 작성


8

하나의 파일을 만드는 명령이 가능한지 궁금하지만 명령이 실행될 때마다 이전 실행에서 작성된 파일을 덮어 쓰지 않습니다.

예를 들어 : touch test1.txt이라는 파일 1 개를 만듭니다 test1.txt. 그러나 다음에 실행할 때 새 파일을 호출 test2.txt하거나 그와 비슷한 것을 원합니다. 따라서 기존 파일을 덮어 쓰지 않아도됩니다. 어떤 방식으로도 문제없이 여러 번 실행될 수 있습니다.

나를 오해하지 마십시오. 하나의 명령으로 여러 파일을 만들려고하지 않습니다.

미리 감사드립니다!

답변:


9

가장 쉬운 해결책은 파일 이름에 타임 스탬프를 추가하고 한 자리 숫자를 사용하지 않는 것입니다.

빈 파일을 만드는 가장 쉬운 방법은 것 touch test$(date +%Y%m%d-%H%M%S)그라는 이름의 파일을 초래할 것이다 test20110802-170410. 두 번째 시간 test*은 새로운 타임 스탬프를 얻으므로 2 개의 파일이 생성됩니다.


이것은 내가 찾던 것입니다, 감사합니다! :)
Nick Lemaire

스크립트에서 작동하지 않습니다 (대기하지 않음)-시도했지만 touch test$(date +%Y%m%d-%H%M%S) ; touch test$(date +%Y%m%d-%H%M%S)파일이 하나만 생성되었습니다. 나노초 시간 작동 : touch test$(date +%Y%m%d-%H%M%S%N) ; touch test$(date +%Y%m%d-%H%M%S%N)touch test$(date +%Y%m%d-%H%M%S%N) test$(date +%Y%m%d-%H%M%S%N)두 개의 파일을 각각 만들 수 있습니다.
Volker Siegel

사용하는 것이 좋습니다 $()둥지 표현식을 수 있기 때문에,하지만 당신은 또한 역 따옴표를 사용할 수 있습니다 touch test`date +%Y%m%d-%H%M%S`.
Pablo Bianchi

5

그렇게하는 일반적인 명령이 의심 스럽지만 다음과 같이 생각할 수 있습니다.

create() {
  read prefix number suffix < <(sed -r 's/(.*)([0-9]+)\.(.*)$/\1 \2 \3/' <<<"$1")
  while true; do
    file="$prefix$number.$suffix"
    if [[ -e "$file" ]]; then
      ((number++))
    else
      touch "$file"
      break
    fi
  done
}

함수의 입력 매개 변수는 접두사, 숫자, 접미사로 나뉘고 파일이 존재할 때까지 숫자가 증가합니다. 사용 가능한 슬롯이 발견되면 파일이로 생성됩니다 touch.

분할 메커니즘은 필요에 맞게 조정해야하며 다양한 오류 검사가 추가되어야합니다.


훌륭하고 훌륭한 기능.
Marco Ceppi

1

시퀀스 번호가 필요하지 않은 경우 가장 쉬운 방법은 mktemp명령 을 사용하는 것 입니다.


mktemp는 템플릿을 사용하여 임의의 고유 한 파일 이름을 생성합니다. 변수에서 mktemp의 출력을 캡처 할 수 있습니다. 에서 linuxmanpages :TMPFILE=$(mktemp /tmp/example.XXXXXXXXXX) || exit 1 echo "program output" >> $TMPFILE
bgvaughan

또 다른 일반적인 방법은 쉘 변수 $$에서 현재 프로세스 ID를 사용하는 것입니다.TMPFILE='/tmp/tmp.$$'; touch $TMPFILE
bgvaughan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.