파일 확장자를 변경하지 않고 상위 디렉터리와 모든 하위 디렉터리에 있는 모든 파일(.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 명령은 사라진 후에는 아무런 효과가 없습니다.
- 각 파일의 날짜를 계산하는 작업을 줄입니다(사용하려는 경우가 아니면 필요하지 않음).통계자료파일의 실제 생성 날짜를 기준으로 파일 이름을 지정합니다.
- 추후 조사를 위해 정보를 기록하고,
- 실제 이름 바꾸기 작업에서 보고된 특정 오류를 기록합니다.
간단한 "예" 응답(때때로 잘못된 키를 누름)으로 스크립트를 실행하는 위험으로 인해 디렉터리의 전체 경로를 명령줄 인수로 지정해야 한다는 점을 더 언급하고 싶습니다. 스크립트가 의도된 "대상"을 시작하기 전에 이를 의식적으로 지정하고 잠재적인 디렉터리 목록을 처리하기 위해 일괄 처리 내에서 호출할 수 있는 도구로 만듭니다.