將檔案名稱中的年月日轉換為工作日

將檔案名稱中的年月日轉換為工作日

我需要採用以下文件名結構並將其重命名為一周中適當的一天:

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實際進行重新命名。

  • <->匹配任何十進制數。
  • 該秒在、和 中的目錄(遞歸)中(...)捕獲。$2(.mp4)$3(**/)$1
  • (#qD.)是一個僅選擇的全域限定符常規的檔案(.:不是目錄,也不是符號鏈接,也不是 fifos/裝置...),還可以遍歷隱藏目錄(D對於 dotfile/dotdir)。
  • ${(L)...}:將副檔名轉換為小寫。
  • strftime -r %Y%m%d:reverse-strftime (strptime) 將日期轉換為紀元時間。
  • strftime %A ...:該紀元時間的格式時間,%A 表示整個工作日。請注意,它取決於區域設定。 (在法國語言環境中,您將獲得法國工作日)。

在 GNU 系統上,使用 GNU shell ( 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,,}beingbash的運算子轉換為小寫。是解析日期的date -dGNU方式(如上)。datestrftime -r

雖然zmv在開始重命名任何檔案之前會檢查衝突,但這個不會。因此,我們添加-i上述內容至少可以讓您有機會避免破壞文件。 GNUmv有一個-v選項可以告訴它顯示它將要執行的操作,如果出現任何問題,這對於稍後恢復命令可能很有用。

相關內容