Sed
使用正則表達式模式替換壞文件、目錄和子目錄名稱
我有一堆在 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 的組合
find
,rename
但是我對正則表達式的使用有點生疏,並且無法為這種情況找到一個好的解決方案。
假設
\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' {} \;
如果目錄樹包含不需要重命名的文件,請不要擔心。如果正則表達式替換不更改文件名,則不重命名文件。