파일 확장자를 변경하지 않고 파일 이름을 재귀적으로 바꾸는 Bash 스크립트

파일 확장자를 변경하지 않고 파일 이름을 재귀적으로 바꾸는 Bash 스크립트

파일 확장자를 변경하지 않고 상위 디렉터리와 모든 하위 디렉터리에 있는 모든 파일(.jpg, .jpeg, .mov 등)의 이름을 date_time_7digitnumber로 바꾸려고 합니다. 아래 스크립트는 이 작업을 수행하지만 여러 번 실행되어 이미 올바른 내용을 변경합니다. 다음은 전체 스크립트입니다. 어떤 도움이라도 대단히 감사하겠습니다!

시스템: MacOS Monterey v12.5 Homebrew는 gdate 사용을 위해 coreutil을 설치했습니다.

#!/usr/bin/env bash

clear

RED='\033[0;31m'
NC='\033[0m'

shopt -s globstar nocaseglob nocasematch nullglob

echo
echo
echo -e "${RED}**********         Your current directory path is " $PWD "             **********${NC}"


read -p "

**********           This function is going to rename all media files with          ********** 

**********                            Date-Time-7digit number                       **********


**********                       !!THIS ACTION CAN NOT BE UNDONE!!                  **********

**********               !!MAKE SURE TO CHANGE TO THE CORRECT DIRECTORY!!           **********

      
      *** ARE YOU ABSOLUTELY SURE YOU ARE IN THE CORRECT DIRECTORY AND WISH TO PROCEED? ***

        
                                            [Y]es or [N]o  "  -n 1 -r



echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]

then

n=1
for f in * ; do
   find . -type f -print0 |
        while IFS= read -r -d '' f ; do
            dd=$(dirname "$f")
            ext=${f##*.}
            new=$(gdate -r "$f" +"%Y%m%d_%H%M%S")-$(printf "%07d%s" "$n")
            mv -vn "$f" "$dd"/"$new"."$ext" ; ((n++))
        done 
      
done  

Echo

Echo Renaming Process Complete!

Echo

afplay /System/Library/Sounds/Ping.aiff

afplay /System/Library/Sounds/Ping.aiff

afplay /System/Library/Sounds/Ping.aiff

fi

여기에 이미지 설명을 입력하세요.

답변1

코드의 다음 부분을 대체하겠습니다.

n=1
for f in * ; do
   find . -type f -print0 |
        while IFS= read -r -d '' f ; do
            dd=$(dirname "$f")
            ext=${f##*.}
            new=$(gdate -r "$f" +"%Y%m%d_%H%M%S")-$(printf "%07d%s" "$n")
            mv -vn "$f" "$dd"/"$new"."$ext" ; ((n++))
        done 
      
done

이 코드를 통해:

DATE=$(date -r "$f" +"%Y%m%d_%H%M%S")
LOG="RENAME_${DATE}.log"    ; rm -f "${LOG}"
ERR="RENAME_${DATE}.err"    ; rm -f "${ERR}"

n=1
for f in *
do
    dd=$(dirname "$f")
    ext=${f##*.}
    new=${DATE}-$(printf "%07d%s" "$n")
        
    COM="mv -vn '${f}' '${dd}/${new}.${ext}'"

    ### LOG Everything for potential recovery action or later troubleshooting search
    echo "${new}.${ext}|${f}|${PWD}|${COM}"
    ${COM} >&2 2>>"${ERR}"

    ((n++))
done  >"${LOG}" 2>&1

목적은 다음과 같습니다.

  • 이것찾다작업은 의미가 없습니다(하위 디렉터리 내용을 찾을 것으로 기대하지만 그렇지 않다고 제안하는 것 같지 않은 한).
  • 이것하지만find 명령은 사라진 후에는 아무런 효과가 없습니다.
  • 각 파일의 날짜를 계산하는 작업을 줄입니다(사용하려는 경우가 아니면 필요하지 않음).파일의 실제 생성 날짜를 기준으로 파일 이름을 지정합니다.
  • 추후 조사를 위해 정보를 기록하고,
  • 실제 이름 바꾸기 작업에서 보고된 특정 오류를 기록합니다.

간단한 "예" 응답(때때로 잘못된 키를 누름)으로 스크립트를 실행하는 위험으로 인해 디렉터리의 전체 경로를 명령줄 인수로 지정해야 한다는 점을 더 언급하고 싶습니다. 스크립트가 의도된 "대상"을 시작하기 전에 이를 의식적으로 지정하고 잠재적인 디렉터리 목록을 처리하기 위해 일괄 처리 내에서 호출할 수 있는 도구로 만듭니다.

관련 정보