递归删除并替换文件名中的所有斜线

递归删除并替换文件名中的所有斜线

我想重命名文件夹子系统中的每个文件,其中包含要替换为下划线的斜线

当前文件名示例:

Hello/there.txt
File/name.jpg

Hello_there.txt
File_name.jpg

这些文件位于同一文件夹系统的不同子文件夹中,斜线位于不同的位置。我尝试使用重命名命令,如下所示:

rename "s/\//_/g" *

但我没有成功。你能给我指明正确的方向吗?

答案1

根据ls你的输出评论,这个角色是一个Unicode 小数斜线而不是普通的 ASCII 斜杠(这在 Unix 文件名中是非法的,因为它被用作路径分隔符)。

在 UTF-8 语言环境中,(U+2044,八进制\342\201\204或十六进制0xE2 0x81 0x84) 是普通字符,您可以使用基于 perl 的rename命令以通常的方式操作/替换它。例如:

$ touch hello⁄there.txt File⁄name.jpg

$ rename -n 's/\342\201\204/_/g' *
rename(File⁄name.jpg, File_name.jpg)
rename(hello⁄there.txt, hello_there.txt)

或者

$ rename -n 's/\xe2\x81\x84/_/g' *
rename(File⁄name.jpg, File_name.jpg)
rename(hello⁄there.txt, hello_there.txt)

-n一旦您确认它正在做正确的事情,就将其删除。

如果你想使用find递归方式下降目录,你可以这样做

find . -type f -name "$(printf '*\342\201\204*')" -execdir rename -n 's/\342\201\204/_/g' {} +

(如果目录名称可以包含\342\201\204并且您也想替换它们,那么您将需要添加-depth和删除-type f限制)。

相关内容