问题描述
我有多个名为 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
请注意,我通过在 \
、 '
和 "
前面添加 \
来转义它们。