我有一堆在Linux中创建的目录、子目录和文件名,其模式如下: YYYY - MM - DD T HH <>: MM : > SS (我在目录/sub/文件名中添加了空格,但没有空格;YYYY,MM,DD.是整数和'-','T',‘’是表达式的常量)。
这些目录/文件被复制到Windows,然后返回到Linux,':‘被破坏了。每个地方都应该有“:”有“357\200\242”显示为?当我做ls时。
我知道使用mv和sed的组合来解决这个问题不应该太复杂,但是我在管道、regex和sed的使用方面非常生疏。
So远我有这个
for a in *T*???*???*; do mv "$(echo "$a" | sed [***])"; done[***]应该是将*T*???*???*更改为*T*:*:*的正则表达式,其中中间的两个*都是两位数字。这应该会递归地重命名文件和目录。我还怀疑???不是这里使用的正确的输入模式。
Alternate方法
我已经看到了一堆提供find和rename组合的帖子,但我对regex的使用还是有点生疏,无法找到一个很好的解决方案。
发布于 2019-01-24 18:13:10
假设\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' {} \;如果目录树包含不需要重命名的文件,请不要担心。如果regex替换不更改文件名,则不会重命名该文件。
https://unix.stackexchange.com/questions/496478
复制相似问题