Rename

將文件名中的年月日轉換為工作日

  • November 20, 2018

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

GMT20161003-randomtext.mp4

最終會成為monday.mp4

我在各個子目錄中有很多這些文件,所以如果它可以遞歸執行會更好……

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)in$3和目錄 ( (**/), recursive) in $1
  • (#qD.)是一個 glob 限定符,它只選擇正常文件(.:不是目錄,也不是符號連結,也不是 fifos/devices…)並且還遍歷隱藏目錄(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 -d是解析日期的 GNUdate方式(strftime -r如上)。

雖然zmv會在開始重命名任何文件之前檢查衝突,但這個不會。所以我們在-i上面添加了一個至少讓你有機會避免破壞文件。GNUmv有一個-v選項可以告訴它顯示它將做什麼,這可能有助於以後在出現任何問題時恢復命令。

引用自:https://unix.stackexchange.com/questions/314214