숫자로 명명된 파일을 확인하고 파일이 있으면 다음 일련 번호를 사용하여 새 이름으로 복사하는 방법

숫자로 명명된 파일을 확인하고 파일이 있으면 다음 일련 번호를 사용하여 새 이름으로 복사하는 방법

내 지식 부족에 대해 사과부터 시작하고 싶습니다. 이것은 실제로 내 첫 번째 bash 스크립트이고 내 Linux 지식은 기본적으로 존재하지 않습니다. 설명적인 답변을 주시면 감사하겠습니다. 방법이 아닌 이유를 이해하고 싶습니다.

하루에 여러 번 수행해야 하는 지루한 프로세스를 자동화하는 스크립트를 작성하려고 합니다. 즉, 이 스크립트는 특정 요구 사항에 따라 파일 세트를 준비해야 합니다. 스크립트는 템플릿 파일을 이동하고 버전 번호를 할당하거나 특정 디렉터리에서 찾은 내용을 기반으로 새 버전 번호로 기존 파일을 복사해야 합니다(예: 비어 있으면 생성, 내용이 있으면 복사). ).

예를 들어 파일 이름은 다음과 같습니다.

YYYYMMDD_##_username_testfile.json

여기서 ##(버전 번호)는 첫 번째 생성의 경우 01, ​​복사본의 경우 02, 후속 복사본의 경우 03 등이어야 합니다. 단일 디렉터리에는 날짜와 순차적 버전 번호가 서로 다른 최대 10개 이상의 파일과 동일한 형식을 사용하지만 testfile.json이 아닌 다른 파일로 끝나는 추가 파일이 포함될 수 있습니다.

스크립트가 testfile.json으로 끝나고 버전 번호가 가장 높은 "test" 디렉터리에서 파일을 찾도록 하는 방법을 찾을 수 없는 것 같습니다. 발견되면 버전 번호를 변수/인수로 추출합니다. cp 시퀀스로 다시 전달할 수 있습니다.

이 시점에서 나는 어떤 명령을 사용해야 할지조차 확신하지 못합니다. 인터넷은 grep에서 awk, 목록 및 정렬에 이르기까지 모든 것을 제공합니다. 머리가 돌고 있습니다!

어떤 도움이라도 대단히 감사하겠습니다. 모든 식별 정보를 삭제했습니다. 추가 정보가 필요하면 알려주시기 바랍니다.

답변1

단계별로 나누어 보겠습니다.

다음 숫자를 반환하는 함수를 작성하겠습니다. 목표는 단순성이지 최대 효율성이 아닙니다.

디렉터리 이름을 지정해야 합니다.

testfile.json파일 이름의 일부를 지정해야 합니다.

이 디렉토리에서 그것으로 끝나는 모든 파일을 찾아야 합니다.

$1, $2 등을 사용하여 매개변수를 함수에 전달합니다.

getnum(){
  ls "$1" | grep "$2\$"
}

두 번째 필드만 제거하고 이를 _구분 기호로 사용하려면 cut을 사용하십시오. (이 작업을 수행하려면 grep 및 cut 대신 sed를 사용하고 다른 사람들은 awk를 사용할 수도 있지만 여기서는 간단하게 유지합니다.)

getnum() {
 ls "$1" | grep "$2\$" | cut -d_ -f 2
}

숫자순으로 정렬하려면 sort를 사용하세요.

getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}

첫 번째 값만 얻으려면 head를 사용하세요.

 getnum() {
  ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
 }

요약하자면, 이 방법으로 지역 변수의 값을 얻을 수 있습니다.

getnum() {
      local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}

값이 없으면 이전 값이 0으로 설정됩니다. 이전 값보다 한 자리 더 많은 2자리 숫자를 인쇄합니다.

 getnum() {
  local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
  if [ "$oldnum" = "" ]
  then
      oldnum=0
  fi
  printf "%02d\n" $(($oldnum+1))
 }

oldnum이 설정되지 않은 경우 테스트는 생략할 수 있습니다. 이 경우 $((oldnum+1)). $((+1))$((${oldnum:-0}+1)) 과 같은 표현식을 사용할 수도 있습니다. 자세한 내용은 매뉴얼을 참조하세요.

그러면 다음과 같은 기능을 사용할 수 있습니다

  dir=somewhere/logs
  ext=testfile.json
  cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"

관련 정보