特定のパターンを使用してファイル名を変更するには、macOS用のシェルスクリプトの助けが必要です。スクリプトは複数のファイルではなく1つのファイルしか処理できません。
以下は3つの例です。
ㅏ。ポピュラースピーチ_(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で一度に1つのファイルを処理するには、このファイルが必要です。
#!/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
。