Sed

使用正則表達式模式替換壞文件、目錄和子目錄名稱

  • January 27, 2019

我有一堆在 Linux 中使用以下模式創建的目錄、子目錄和文件名:YYYY - MM - DD T HH : MM : SS(為了清楚起見,我添加了空格,但目錄/子/中沒有空格文件名;YYYY、MM、DD… 是整數,’-’、‘T’、’:’ 是表達式的常量)。

這些目錄/文件被複製到 Windows,然後又複製回 Linux,’:’ 已損壞。每個應該有 ‘:’ 的地方都有 ‘\357\200\242’ 顯示為 ??? 當我這樣做的時候ls

mv我知道使用and的組合來解決這個問題應該不會太複雜sed,但是我對管道、正則表達式和sed用法非常生疏。

到目前為止我有這個

for a in *T*???*???*; do mv "$(echo "$a" | sed [***])"; done

[***]應該是一個正則表達式,*T*???*???*中間兩個*T*:*:*都是*兩位數。這應該遞歸地重命名文件和目錄。我也懷疑這???不是在這裡使用的正確輸入模式。

替代方法

我已經看到一堆文章提供了 and 的組合findrename但是我對正則表達式的使用有點生疏,並且無法為這種情況找到一個好的解決方案。

假設\357\200\242是八進制數。嘗試:

rename -n 's/\o{357}\o{200}\o{242}/:/g' 2018-*

該命令rename適用於 Perl 正則表達式替換。在這裡,它將以八進製字節值給出的三個字元替換為冒號。

因為-n這只是列印它會做什麼。因此,您可以在不破壞某些東西的情況下進行測試。

當您確定這可以滿足您的要求時,請在沒有-n.

如果需要遍歷整個目錄樹,結合find:

find . -depth -exec rename -n 's/\o{357}\o{200}\o{242}/:/g' {} \;

如果目錄樹包含不需要重命名的文件,請不要擔心。如果正則表達式替換不更改文件名,則不重命名文件。

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