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

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

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

我该如何更换它?

答案1

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

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

这会预览重命名。应将其替换:-

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

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

答案2

这是一个纯 bash 解决方案:

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

${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

基本上,这个想法意味着[ ]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

请注意,我在每个符号前面都添加了一个\,从而省略了'和。"\

答案3

如果您更喜欢 GUI,请安装 pyrenamer:

sudo apt-get install pyrenamer

然后运行它:

pyrenamer

它有几十种模式和重命名格式的选项。

答案4

renameutils软件包有一个方便的程序,名为qmv,它提供交互式批量重命名。您可以在目录或文件列表上运行它,它会生成一个包含文件名的临时文本文件,并启动您最喜欢的编辑器。当您退出编辑器时,您更改的任何文件名都会相应地重命名。qmv将批量重命名问题变成文本编辑问题。

在这种情况下,您可以使用qmv -f do *:*编辑所有包含冒号的文件的名称,然后使用:%s/:/_/gVim 中的命令(或在您使用的任何编辑器中使用相应的搜索和替换)。

-f do选项将文本文件的格式设置为仅包含目标文件名,这使得搜索和替换更简单。默认格式在每行上有两个文件名副本,您只需要编辑第二个。如果您删除或重新排序了文件中的行,这允许它做正确的事,但这并不总是最简单的。还有其他格式。

使用,如果您不想要交互功能,qmv您可以选择通过您选择的命令来传输生成的文件,例如。sed

相关内容