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

Bob*_*oss 5 regex find rename

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

当前文件名示例:

Hello/there.txt
File/name.jpg
Run Code Online (Sandbox Code Playgroud)

Hello_there.txt
File_name.jpg
Run Code Online (Sandbox Code Playgroud)

这些文件位于同一文件夹系统的不同子文件夹中,斜线位于不同的位置。我尝试使用 rename-command 如下:

rename "s/\//_/g" *
Run Code Online (Sandbox Code Playgroud)

但我无法取得任何成功。你能给我一个正确的方向吗?

ste*_*ver 7

根据ls您的评论中的输出,有问题的字符是Unicode 分数斜杠而不是普通的 ASCII 斜杠(这在 Unix 文件名中是非法的,因为它被用作路径分隔符)。

在 UTF-8 语言环境中,?(U+2044, Octal\342\201\204或 hex 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)
Run Code Online (Sandbox Code Playgroud)

或者

$ rename -n 's/\xe2\x81\x84/_/g' *
rename(File?name.jpg, File_name.jpg)
rename(hello?there.txt, hello_there.txt)
Run Code Online (Sandbox Code Playgroud)

-n一旦你对它做正确的事情感到高兴,就删除它。

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

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

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