임의의 디렉토리내의 파일명에 근거해 일련번호 파일을 작성하는 쉘 스크립트

5520 단어 ShellScript
매일 발생하는 기술 자료, 아이디어는 MarkDown 형식으로 적당히 추가하고 있습니다. 중요한 것은 모두에서 "속도"입니다.

저의 라이프 스타일적으로 MarkDown 파일을 만드는 빈도가 엄청 높습니다.

파일 이름을 수동으로 입력하는 것이 귀찮습니다.



MarkDown 파일을 만들 때마다 파일 이름을 수동으로 붙이고 있었지만, 다음과 같은 과제가 현저하게 나타났습니다.
  • 명명에서 케어리스 미스 발생
  • 파일 이름을 붙이는 것만으로 시간이 많이 걸립니다

  • 라고 하는 것으로 임의의 디렉토리내의 파일명을 바탕으로 연속 번호 파일을 작성하는 쉘 스크립트를 만들어 자동화해 보고 싶습니다.

    이번에 만들고 싶은 파일의 형식은 이쪽입니다.

    「연월일 연번(3자리)-임의의 문자열」

    자동화하는 것은 「연월일 연번(3자리수)」 부분입니다.

    요구사항


  • 날짜는 로컬 날짜와 시간
  • 이미 같은 이름이 있으면 연속 번호를 증가
  • 일련 번호는 3 자리 고정으로 3 자리가 충족되지 않으면 0으로 채워집니다

  • 날짜는 로컬 날짜와 시간


    date=`date '+%Y%m%d'`
    # 出力例 : 20200922
    

    date 함수를 사용하여 날짜 문자열을 만듭니다. 개인적으로 서식을 처음 + 잊어 버리기 쉽습니다.

    지정된 디렉토리에 파일 이름 목록 작성



    이번 검색 대상은 drafts/ 디렉토리내 및 MarkDown 파일만입니다.
    # draftsディレクトリ内を検索
    dir='drafts/'
    
    # 検索対象
    target="$dir*.md"
    
    # find関数で検索ファイルパスのリストを作成
    files=`find $target -type f -maxdepth 0 -name $date*`
    

    find 함수를 사용하여 지정한 검색할 파일 경로 목록을 가져옵니다.

    find 함수의 보충 설명


    -type f
    
    -type 선택적으로 파일을 검색합니다. (폴더는 대상에서 제외)
    -maxdepth 0
    
    -maxdepth 0 선택적으로 하위 폴더가 검색되지 않습니다.
    -name $date*
    
    -name 선택적으로 파일 이름 규칙을 추가하여 필터링합니다.

    이제 파일 변수에 지정된 날짜의 MarkDown 파일 경로 목록이 저장되었습니다.

    일련 번호 만들기



    예 : drafts/20200922004-hogehoge
    이 "004"의 부분. 문자열 15번째부터 세 개의 문자열을 추출합니다.
    # 作成済み連番の最大値
    max_serial=0
    for filepath in $files;
    do
      # 連番情報を抽出する
      serial_num_str=`echo ${filepath:15:3}`
    
      # 文字列を数字にキャスト
      serial_num=$(expr $serial_num_str)
    
      # 連番の最大値を保持
      if [ $max_serial -lt $serial_num ];then
        max_serial=$serial_num
      fi
    done
    

    파일 이름의 일련 번호를 추출하여 최대값을 가져옵니다.

    문자열을 숫자로 캐스팅하여 비교



    캐릭터 라인의 그대로라면 수치의 비교는 할 수 없기 때문에, 수치에 캐스트 합니다.
    serial_num=$(expr $serial_num_str)
    

    이 부분에서 문자열(예:012)을 숫자(12)로 캐스팅하고 있습니다.
    if [ $max_serial -lt $serial_num ];then
    
    -lt 를 사용하여 비교하고 있습니다. if [ A -lt B ] A가 B보다 작으면 max_serial을 갱신합니다.

    일련 번호를 증가시켜 파일 생성


    new_id=$(expr $max_serial + 1)
    

    이전의 캐스트 처리를 사용해 사용하는 일련번호를 결정합니다.

    세 자리에 0 채우기


    new_num=`printf %03d $new_id`
    

    printf 함수에 인수로 형식( %03d )을 지정하고 필요한 경우 0으로 채웁니다.
    예: 12 -> 012

    마지막으로



    아래의 gif 애니메이션에서는 알기 힘들지만, 쉘을 실행할 때마다 일련 번호 파일이 작성되게 되었습니다.



    이것으로 기술 메모할 때의 MarkDown 작성의 스트레스가 줄어들 것 같습니다.

    모든 소스는 이쪽으로 올라갑니다.

    참고 사이트


  • 파일 등을 검색! find 커멘드의 상세 정리【Linux 커맨드집】
  • 좋은 웹페이지 즐겨찾기