通过替换字符来更改多个文件名

use*_*152 32 command-line

我有多个名为that : screenshot 13:25.png
Windows 的文件很难打开这些文件,可能是因为“:”。

我怎样才能更换它?

Oli*_*Oli 54

在终端中,cd进入正确的目录,然后运行它。

rename 's/\:/-/g' *.png -vn
Run Code Online (Sandbox Code Playgroud)

这将预览重命名。它应该替换:-.

如果看起来正确,请n从末尾删除,然后它将进行实际的重命名。

注意:17.04 以上的 Ubuntu 版本不附带rename,但它仍然可以在默认存储库中使用,因此请使用sudo apt install rename获取它

  • 为什么要使用它?它向您展示了它在做什么(如果您犯了错误,则更容易逆转)。为什么到最后?只是为了您可以轻松删除它(或`n`)。 (2认同)

ter*_*don 11

这是一个纯 bash 解决方案:

for i in *:*; do
    mv -- "$i" "${i//:/_}"
done
Run Code Online (Sandbox Code Playgroud)

${var//pattern/replacement}格式将替换变量中所有出现的patternwith 。有关 bash 的字符串处理功能的更多信息,请参见此处replacement$var

如果要对多个字符执行此操作,只需将它们放在一个字符类中即可。因此,例如,要将所有;, :, =, +, %,,替换为下划线,您可以执行以下操作:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv -- "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar
Run Code Online (Sandbox Code Playgroud)

基本上,这个想法[ ]意味着any of the characters listed. 因此,通过将您要替换的所有字符放入字符类中,所有这些字符都会被一次性处理。

--mv表示的选项的结束,需要使这个甚至会工作了开头的文件名,-否则将被视为传递给选项mv


对于您要求的特定字符,事情有点复杂,因为其中一些需要转义(我忽略了/因为 *nix 不允许它在文件名中的使用次数超过 Windows,因此不会是问题):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv -- "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar
Run Code Online (Sandbox Code Playgroud)

请注意,我通过在每个前面添加了\,'"进行了转义\