首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex模式替换坏文件、目录和子目录名称

问使用regex模式替换坏文件、目录和子目录名称
EN

Unix & Linux用户
提问于 2019-01-24 14:34:21
回答 1查看 314关注 0票数 2

我有一堆在Linux中创建的目录、子目录和文件名,其模式如下: YYYY - MM - DD T HH <>: MM : > SS (我在目录/sub/文件名中添加了空格,但没有空格;YYYY,MM,DD.是整数和'-','T',‘’是表达式的常量)。

这些目录/文件被复制到Windows,然后返回到Linux,':‘被破坏了。每个地方都应该有“:”有“357\200\242”显示为?当我做ls时。

我知道使用mv和sed的组合来解决这个问题不应该太复杂,但是我在管道、regex和sed的使用方面非常生疏。

So远我有这个

代码语言:javascript
复制
for a in *T*???*???*; do mv "$(echo "$a" | sed [***])"; done

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

Alternate方法

我已经看到了一堆提供find和rename组合的帖子,但我对regex的使用还是有点生疏,无法找到一个很好的解决方案。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-01-24 18:13:10

假设\357\200\242是八进制数。尝试:

代码语言:javascript
复制
rename -n 's/\o{357}\o{200}\o{242}/:/g' 2018-*

命令rename使用Perl正则表达式替换。这里,它用冒号替换三个作为八进制字节值的字符。

因为有了-n,这只会打印它会做什么。所以你可以在不破坏某些东西的情况下进行测试。

当您确信这做了您想做的事情时,可以不使用-n执行。

如果需要遍历整个目录树,请将其与find结合起来:

代码语言:javascript
复制
find . -depth -exec rename -n 's/\o{357}\o{200}\o{242}/:/g' {} \;

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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/496478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档