当前位置: 首页>>技术教程>>正文


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

问题描述

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

我怎样才能更换它?

最佳方法

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

rename 's/\:/-/g' *.png -vn

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

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

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

次佳方法

这是一个纯 bash 解决方案:

for i in *:*; do
    mv -- "$i" "${i//:/_}"
done

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

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

$ 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

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

mv 之后的 -- 表示选项的结束并且是必需的,因此即使对于以 - 开头的文件名也适用,否则将被视为传递给 mv 的选项。


对于您要求的特定字符,事情有点复杂,因为 some of them 需要是 escaped(我忽略了 /,因为 *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

请注意,我通过在 \'" 前面添加 \ 来转义它们。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11951.html,未经允许,请勿转载。