![通过替换字符来更改多个文件名](https://linux22.com/image/847618/%E9%80%9A%E8%BF%87%E6%9B%BF%E6%8D%A2%E5%AD%97%E7%AC%A6%E6%9D%A5%E6%9B%B4%E6%94%B9%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%8D.png)
我有多个名为的文件,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}
格式将替换变量中所有出现的pattern
with 。有关 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/:/_/g
Vim 中的命令(或在您使用的任何编辑器中使用相应的搜索和替换)。
该-f do
选项将文本文件的格式设置为仅包含目标文件名,这使得搜索和替换更简单。默认格式在每行上有两个文件名副本,您只需要编辑第二个。如果您删除或重新排序了文件中的行,这允许它做正确的事,但这并不总是最简单的。还有其他格式。
使用,如果您不想要交互功能,qmv
您可以选择通过您选择的命令来传输生成的文件,例如。sed