使用正则表达式模式替换错误的文件、目录和子目录名称

使用正则表达式模式替换错误的文件、目录和子目录名称

我有一堆在 Linux 中创建的目录、子目录和文件名,其模式如下:YYYY - 毫米 - DD 时间 赫赫 : 毫米 : SS(为了清楚起见,我添加了空格,但目录/子/文件名中没有空格;YYYY、MM、DD...是整数,“-”、“T”、“:”是表达式的常量)。

这些目录/文件被复制到 Windows,然后又复制回 Linux,并且“:”已损坏。每个应该有 ':' 的地方都有 '\357\200\242',显示为 ???当我做ls

mv我知道使用和的组合来解决这个问题应该不会太复杂sed,但我对我的管道、正则表达式和sed用法非常生疏。

到目前为止我有这个

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

应该[***]是一个正则表达式,更改*T*???*???**T*:*:*中间两个*各为两位数字。这应该递归地重命名文件和目录。我还怀疑这???不是此处使用的正确输入模式。

替代方法

我看过很多帖子提供了find和的组合rename,但同样,我对正则表达式的使用有点生疏,并且无法针对这种情况找到一个好的解决方案。

答案1

假设\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' {} \;

如果目录树包含不需要重命名的文件,请不要担心。如果正则表达式替换没有更改文件名,则不会重命名该文件。

相关内容