Rename
遞歸地從文件名中刪除字元
我有數百個目錄,其中一些嵌套在其他目錄中,文件數以萬計。這些文件需要從其中刪除日期/時間戳。
一個範例文件名是
Letter to Client 27May2016~20160531-162719.pdf
,我希望它恢復原狀Letter to Client 27May2016.pdf
另一個範例文件名是
ABCDEF~20160531-162719
,我希望它恢復為ABCDEF
. 請注意,與上面的範例不同,此文件沒有副檔名。我需要一個可以在受影響文件夾的根目錄執行的命令,該命令將遞歸地通過並查找/修復文件名。
(我使用 Syncthing 來同步文件,並通過將已刪除的文件從
.stversions
目錄複製回它們所在的位置來恢復它們,但發現 Syncthing 附加了該日期/時間戳……)
認識 Perl
rename
工具:$ rename -n -v 's/~[^.]+//' *~* rename(ABCDEF~20160531-162719, ABCDEF) rename(Letter to Client 27May2016~20160531-162719.pdf, Letter to Client 27May2016.pdf)
該正則表達式表示要匹配波浪號,因為許多字元不是點,但至少是一個;並用空字元串替換任何匹配的內容。刪除
-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
實際進行重命名。