ファイル名の年月日を曜日に変換する

ファイル名の年月日を曜日に変換する

次のファイル名構造を取得し、適切な曜日に合わせて名前を変更する必要があります。

GMT20161003-randomtext.mp4

結局はmonday.mp4

さまざまなサブディレクトリにこれらのファイルがたくさんあるので、再帰的に実行できればもっと良いでしょう...

答え1

zsh

zmodload zsh/datetime
autoload zmv
zmv -n '(**/)GMT(<->)*(.mp4)(#qD.)' '$1${(L)$(
  strftime %A "$(strftime -r %Y%m%d $2)")}$3'

-n実際に名前を変更するには、を削除します。

  • <->任意の 10 進数に一致します。
  • その 2 番目は、のおよび のディレクトリ ( 、再帰的) で(...)キャプチャされます。$2(.mp4)$3(**/)$1
  • (#qD.)は、選択するグロブ修飾子です通常ファイル ( .: ディレクトリ、シンボリックリンク、FIFO/デバイスなどではありません) および隠しディレクトリ ( Ddotfile/dotdir の場合) もスキャンします。
  • ${(L)...}: 拡張部分を小文字に変換します。
  • strftime -r %Y%m%d: 日付をエポック時間に変換するには、reverse-strftime (strptime) を使用します。
  • strftime %A ...: そのエポック時間の時間をフォーマットします。%A は完全な曜日を表します。ロケールに依存することに注意してください。(フランス語のロケールでは、フランス語の曜日が表示されます)。

GNU システムで GNU シェル ( bash) を使用すると、次の操作を実行できます。

find . -name 'GMT*-*.mp4' -type f -exec bash -c '
  for file do
    base=${file##*/}
    date=${base#GMT}
    date=${date%%-*}
    wday=$(date -d "$date" +%A)
    echo mv -i "$file" "${file%/*}/${wday,,}.mp4"
  done' bash {} +

(echo操作を実行するには削除してください)。

${var,,}bashは小文字に変換する演算子です。は日付を解析するdate -dGNU の方法です(上記のように)。datestrftime -r

はファイル名の変更を開始する前に競合をチェックしますがzmv、これはそうしません。そのため、-i少なくともファイルの上書きを回避する機会を提供するために、上記の を追加します。GNU には、何を行うかを表示するように指示するオプションmvがあり-v、何か問題が発生した場合に後でコマンドを元に戻すのに役立つ場合があります。

関連情報