Rename

遞歸地從文件名中刪除字元

  • April 20, 2019

我有數百個目錄,其中一些嵌套在其他目錄中,文件數以萬計。這些文件需要從其中刪除日期/時間戳。

一個範例文件名是Letter to Client 27May2016~20160531-162719.pdf,我希望它恢復原狀Letter to Client 27May2016.pdf

另一個範例文件名是ABCDEF~20160531-162719,我希望它恢復為ABCDEF. 請注意,與上面的範例不同,此文件沒有副檔名。

我需要一個可以在受影響文件夾的根目錄執行的命令,該命令將遞歸地通過並查找/修復文件名。

(我使用 Syncthing 來同步文件,並通過將已刪除的文件從.stversions目錄複製回它們所在的位置來恢復它們,但發現 Syncthing 附加了該日期/時間戳……)

認識 Perlrename工具:

$ rename -n -v  's/~[^.]+//' *~*
rename(ABCDEF~20160531-162719, ABCDEF)
rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)

線上手冊頁,另見此 Q

該正則表達式表示要匹配波浪號,因為許多字元不是點,但至少是一個;並用空字元串替換任何匹配的內容。刪除-n以實際進行替換。我們可以將模式更改~[-0-9]+為僅替換數字和破折號。

抱歉,您說的是“遞歸”,所以讓我們使用find

$ find -type f -name "*~*" -execdir  rename -n -v  's/~[-0-9]+//' {} +
rename(./ABCDEF~20160531-162719, ./ABCDEF)
rename(./Letter to Client 27May2016~20160531-162719.pdf, ./Letter to Client 27May2016.pdf)

或者只是使用 Bash 或 ksh,儘管~後跟數字的目錄會破壞這一點:

$ shopt -s extglob       # not needed in ksh (as far as I can tell)
$ shopt -s globstar      # 'set -o globstar' in ksh
$ for f in **/*~* ; do 
   g=${f//~+([-0-9])/}; 
   echo mv -- "$f" "$g" 
 done
mv -- ABCDEF~20160531-162719 ABCDEF
mv -- Letter to Client 27May2016~20160531-162719.pdf Letter to Client 27May2016.pdf

再次,刪除echo實際進行重命名。

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