以递归方式替换特殊字符

问题描述 投票:1回答:1

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

我得到的最接近的是:

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

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

bash loops tr mv
1个回答
4
投票

你可以这样做:

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

这里有几点:

  • -depth - 首先遍历目录层次结构。这可确保在重命名文件夹之前重命名文件夹中的文件
  • -execdir - 执行子目录中的命令 - {}现在将是./filename而不是./dir1/dir2/filename
  • 这是perl风味的rename,请查看您的手册页。
© www.soinside.com 2019 - 2024. All rights reserved.