递归替换特殊字符 bash

Replace special characters recursively bash

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

我得到的最接近的是:

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

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

你可以这样做:

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

这里有几点:

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