
我需要採用以下文件名結構並將其重命名為一周中適當的一天:
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 -d
GNU方式(如上)。date
strftime -r
雖然zmv
在開始重命名任何檔案之前會檢查衝突,但這個不會。因此,我們添加-i
上述內容至少可以讓您有機會避免破壞文件。 GNUmv
有一個-v
選項可以告訴它顯示它將要執行的操作,如果出現任何問題,這對於稍後恢復命令可能很有用。