我有一堆在 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' {} \;
如果目录树包含不需要重命名的文件,请不要担心。如果正则表达式替换没有更改文件名,则不会重命名该文件。