正規表現を使用してMac OS端末でファイル名を変更するか、Windowsスクリプトから翻訳する

正規表現を使用してMac OS端末でファイル名を変更するか、Windowsスクリプトから翻訳する

特定のパターンを使用してファイル名を変更するには、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なけれtitlespeaker nameなりませんtimestamp

  1. プレフィックス「Public Talks_」を削除
  2. 必要に応じてトラック番号を3桁の数字に分割し、前に0を付けます。
  3. 4つの要素すべての間にダッシュ
  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

関連情報