Bash에서 순차적으로 번호가 매겨진 파일 이름을 만드는 방법은 무엇입니까?

Bash에서 순차적으로 번호가 매겨진 파일 이름을 만드는 방법은 무엇입니까?

파일과 다음 파일을 순서대로 생성하려면 스크립트가 필요합니다. 스크립트를 실행할 때마다 하나의 파일만 생성되어야 하며 특정 날짜에 스크립트를 0번 이상 실행할 수 있습니다. 파일 이름은 현재 날짜를 따라 지정되어야 하며, %y%m%d두 번째 파일을 추가하거나 -01특정 날짜에 생성된 세 번째 파일 등을 추가하는 형식 이어야 합니다 -02. 예를 들어:

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file

지금까지 첫 번째 일일 파일을 생성하기 위한 매우 기본적인 스크립트가 있지만 그 이후에 증분 번호 매기기를 수행하는 방법이 혼란스럽습니다.

#! /bin/bash

DATE=`date +%Y%m%d`
touch "$DATE.txt"

답변1

today=$( date +%Y%m%d )   # or: printf -v today '%(%Y%m%d)T' -1
number=0

fname=$today.txt

while [ -e "$fname" ]; do
    printf -v fname '%s-%02d.txt' "$today" "$(( ++number ))"
done

printf 'Will use "%s" as filename\n' "$fname"
touch "$fname"

today오늘 날짜를 얻으려면 카운터를 number0으로 초기화하고 접미사가 붙은 날짜로 초기 파일 이름을 만듭니다 .txt.

그런 다음 파일 이름이 이미 존재하는지 테스트합니다. 그렇다면 카운터를 늘리고 printf. 더 이상 파일 이름 충돌이 없을 때까지 이 작업을 반복합니다.

printf, 의 형식 문자열은 %s-%02d.txt"문자열, 대시, 0으로 채워진 두 자리 정수 및 문자열 .txt"을 의미합니다. 문자열과 정수가 추가 인수로 제공됩니다 printf.

-v fname의 출력을 printf변수에 넣습니다 fname.

단지 touch테스트를 위해서입니다.

그러면 다음과 같은 파일 이름이 생성됩니다.

20170125.txt
20170125-01.txt
20170125-02.txt
20170125-03.txt

후속 실행을 기다립니다.

답변2

당신은 그것을 사용할 수 있습니다 seq. 다양한 방법으로 번호 매기기 순서를 만들 수 있지만 총 파일 수를 알아야 합니다.

예: 이것을 시도해 볼 수 있습니다 seq -w 1 10. 그러면 for 루프에 포함할 수 있는 01시퀀스가 ​​생성됩니다 .10

for i in `seq -w 1 10`
do
  touch `date +%Y%m%d`-$i.txt
done

최근 질문에 대한 부록이 업데이트되었습니다.

원하는 것을 쉽게 달성하려면 -0. 후속 실행에서는 파일 목록을 가져온 다음 sort마지막 파일에서 마지막 파일을 추출하고 번호를 가져와서 증가시킨 다음 해당 번호로 새 파일을 만들어야 합니다.cut-

하지만 채우기에는 여전히 약간의 작업이 필요합니다.

답변3

그것은 마치 ...

#!/bin/bash
DATE=$(date +%Y%m%d)
filename="${DATE}.txt"
num=0
while [ -f $filename ]; do
    num=$(( $num + 1 ))
    filename="${DATE}-${num}.txt"
done
touch $filename

...작동해야 합니다. 이렇게 하면 DATE-1.txt, DATE-2.txt, DATE-3.txt, ..., DATE-10.txt, DATE-11.txt 등의 형식으로 파일 이름이 생성됩니다. DATE-01.txt 등으로 변경하는 것은 독자의 연습 과제로 남겨둡니다 :)

또한 동시에 여러 번 스크립트를 호출하지 않도록 해야 합니다. 그렇지 않으면 여러 스크립트가 수정하는 일이 발생하게 됩니다.

참고 사항: 여러 버전의 파일을 관리할 수 있는 소프트웨어가 많이 있습니다. 이를 "버전 제어 시스템"(VCS) 또는 "소스 코드 제어 관리"(SCM)라고 합니다. Git과 Subversion은 매우 인기가 있습니다. 직접 다시 구현하기보다는 확인해 보는 것이 좋습니다. :-)

답변4

카운터 값이 이미 환경 변수에 있는 경우 Bash 산술을 사용하여 파일 이름을 생성할 수 있습니다.... $(( ctr+=1 )) 는 ctr 값을 증가시키고 파일 이름 문자열의 값을 대체합니다.

$ ctr=0
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ touch file-$(( ctr+=1 ))-name.txt
$ ls
file-1-name.txt  file-2-name.txt file-3-name.txt  file-4-name.txt

관련 정보