【问题标题】:Replace special characters recursively bash递归替换特殊字符bash
【发布时间】:2018-09-06 14:17:38
【问题描述】:

我正在尝试查找某个文件夹和所有子文件夹中的所有文件和文件夹并替换所有特殊字符。所有空格都应替换为点,其他所有内容都应删除。我尝试了几种不同的方法,但是当我使用“mv”时,它似乎并没有保留目录结构,当我使用“rename”和“find”时,它不想递归。

我得到的最接近的是:

for f in **/; do mv "$f" `echo $f | tr " " . | tr -dc '[:alnum:].'`; done

但我认为循环在某处被破坏,因为它将文件名添加在一起并将结果放在父目录中。

【问题讨论】:

  • 点也应该删除?
  • 您想替换文件名中的所有特殊字符,而不是文件内容,对吧?
  • 因为你要删除斜线,它当然不会记住文件夹结构。
  • 点应该保留。仅来自文件名的所有特殊字符,正确。
  • 什么确切地算作“特殊字符”?例如,-(连字符)或_(下划线)是否特殊?

标签: bash loops tr mv


【解决方案1】:

你可以这样做:

find . -depth -execdir rename 's/\s/./g; s/[^[:alnum:]./]//g' {} +

这里有几点:

  • -depth -- 深度优先遍历目录层次结构。这可确保您在重命名文件夹之前重命名文件夹中的文件
  • -execdir -- 在子目录中执行命令 -- {} 现在将是./filename 而不是./dir1/dir2/filename
  • 这是 perl 风格的 rename,请查看您的手册页。

【讨论】:

  • 你的评论是 perl 风格的,这就是它在每个文件的开头添加一个点的原因吗?
  • 可能不会。此时的文件名可能是./filename,您可能正在删除斜线。
  • 我有点作弊并将您的解决方案分解为 2 个不同的查找行。每个重命名语句一个。第一个效果很好,但第二个说“替换模式未在(用户提供的代码)处终止。”
猜你喜欢
  • 2017-07-05
  • 2017-10-19
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多