我想重命名文件夹子系统中的每个文件,其中包含要替换为下划线的斜线
当前文件名示例:
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
限制)。