我想重命名文件夹子系统中的每个文件,其中包含要用下划线替换的斜杠
当前文件名示例:
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)
但我无法取得任何成功。你能给我一个正确的方向吗?
根据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限制)。