Rename
將文件名中的年月日轉換為工作日
我需要採用以下文件名結構並重命名為一周中的適當日期:
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
選項可以告訴它顯示它將做什麼,這可能有助於以後在出現任何問題時恢復命令。