특정 패턴을 사용하여 파일 이름을 바꾸려면 macOS용 쉘 스크립트에 대한 도움이 필요합니다. 스크립트는 여러 파일이 아닌 하나의 파일만 처리할 수 있습니다.
다음은 세 가지 예입니다.
ㅏ. 대중 연설_ (189) 하나님과 함께 걷는 것은 지금부터 영원히 축복을 가져옵니다 — 크리스 러셔 10_28_2023.mp3
될 것입니다
189-하나님과 함께 걷는 것은 지금부터 영원히 축복을 가져온다 - 크리스 러셔 - 2023-10-28-0900.mp3
b. 대중 연설_ (55) 어떻게 하면 하나님 앞에서 좋은 평판을 얻을 수 있습니까? —그레고리 듀혼11_4_2023.mp3
될 것입니다
055 어떻게 하면 하나님 앞에서 좋은 평판을 얻을 수 있나요? - 그레고리 뒤혼 - 2023-11-04-0900.mp3
씨. 대중 연설_ (9) 하나님과 함께 걷는 것은 지금과 영원히 축복을 가져옵니다 — 크리스 러셔 10_28_2023.mp3
될 것입니다
009-하나님과 함께 걷는 것은 지금부터 영원히 축복을 가져온다 - 크리스 러셸 - 2023-10-28-0900.mp3
따라서 기본적으로 최종 형식과 순서는 track number
, title
, speaker name
및 이어야 합니다 timestamp
.
- 접두사 "Public Talks_" 제거
- 필요에 따라 트랙 번호를 3자리 숫자로 분리하고 앞에 0을 붙입니다.
- 4개 요소 모두 사이에 대시
- 날짜를 yyyy-mm-dd-0900과 같은 타임스탬프로 다시 지정합니다.
그런 다음 셸 스크립트를 가져와 이 대화 상자의 각 파일에서 사용합니다(반복할 필요 없음).
아래 대화 상자에 표시된 것처럼 쉘 스크립트에 전달된 파일 변수는 "$1"로 작성되어야 합니다.
누군가 내가 파일을 만드는 데 도움을 주었지만 Windows에서만 작동하고 "$1"을 파일로 간주하지 않으며 여러 파일을 처리하도록 설정되었습니다. macOS에서 한 번에 하나의 파일을 처리하려면 이 파일이 필요합니다.
#!/bin/bash
for file in *.mp3; do
# Remove "Public Talks_"
newname=${file#"Public Talks_ "}
# Extract the track number and pad with leading zeros
track=$(echo $newname | grep -o -E '\([0-9]+\)' | tr -d '()' | awk '{printf "%03d\n", $0}')
# Remove track number and trailing spaces
newname=$(echo $newname | sed -E 's/\([0-9]+\)//' | sed 's/^ *//')
# Extract the title and speaker
title=$(echo $newname | awk -F '—' '{print $1}' | sed 's/ *$//')
speaker=$(echo $newname | awk -F '—' '{print $2}' | awk '{print $1, $2}')
# Extract the date and reformat
date=$(echo $newname | grep -o -E '[0-9]+_[0-9]+_[0-9]+' | tr '_' '-' | awk -F- '{print $3"-"$1"-"$2"-0900"}')
# Concatenate all elements with dashes
newname="$track - $title - $speaker - $date.mp3"
# Rename the file
mv "$file" "$newname"
done
누구든지 이것을 올바른 macOS 구문으로 변환하거나 더 깔끔한 쉘 스크립트를 작성할 수 있습니까?
답변1
zsh의 이러한 파일이 포함된 디렉터리에서 다음을 실행합니다.
autoload -Uz zmv
zmv -n '*_ \((<0-999>)\)(* )—( * )(<1-12>)_(<1-31>)_(<1900-2100>)(.mp3)' \
'${(l[3][0])1} -$2-$3- $6-${(l[2][0])5}-${(l[2][0])4}-0900$7'
예:
$ autoload -Uz zmv
$ zmv -n '*_ \((<0-999>)\)(* )—( * )(<1-12>)_(<1-31>)_(<1900-2100>)(.mp3)' \
'${(l[3][0])1} -$2-$3- $6-${(l[2][0])5}-${(l[2][0])4}-0900$7'
mv -- 'Public Talks_ (189) Walking With God Brings Blessings Now and Forever — Chris Ruscher 10_28_2023.mp3' '189 - Walking With God Brings Blessings Now and Forever - Chris Ruscher - 2023-28-10-0900.mp3'
mv -- 'Public Talks_ (55) How Can You Make a Good Name With God? — Gregory Duhon 11_4_2023.mp3' '055 - How Can You Make a Good Name With God? - Gregory Duhon - 2023-4-11-0900.mp3'
mv -- 'Public Talks_ (9) Walking With God Brings Blessings Now and Forever — Chris Ruscher 10_28_2023.mp3' '009 - Walking With God Brings Blessings Now and Forever - Chris Ruscher - 2023-28-10-0900.mp3'
만족스러우면 삭제 -n
(테스트 실행)합니다.
파일 이름을 인수로 사용하는 쉘 스크립트여야 하는 경우:
#! /bin/zsh -
set -o extendedglob
pattern='(#b)*_ \((<0-999>)\)(* )—( * )(<1-12>)_(<1-31>)_(<1900-2100>)(.mp3)'
ret=0
for file {
if [[ $file = $~pattern ]] {
argv=( "$match[@]" )
mv -i -- $file "${(l[3][0])1} -$2-$3- $6-${(l[2][0])5}-${(l[2][0])4}-0900$7" || ret=$?
} else {
print -ru2 "Skipping $file which doesn't match the pattern"
}
}
exit $ret
하지만 추가 보호 장치가 누락될 수 있습니다 zmv
.
첫 번째 매개변수( )만 처리하는 대신 스크립트의 모든 매개변수를 반복합니다 $1
.