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


29

我有多个名为that : screenshot 13:25.png
Windows的文件,可能由于“:”而无法打开这些文件。

我该如何更换?


2
您能否接受将问题标记为已解决的答案?这将极大地帮助其他用户。
MERose

Answers:


52

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

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

这将预览重命名。就应更换:-

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

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


感谢您的answer.I试过,我有这样的问题:在(EVAL 1)第1行没有终止替代模式
user236152

@ user236152对不起,我对转义的反斜杠有点生气(使用自动驾驶仪!)。删除了一对,它现在应该有效。
奥利(Oli)

也许一个简单的Nautilus脚本替换所有可能在其他平台上引起问题的字符(在所有选定文件上运行)可能对“多平台”人员有用。
萨迪2014年

2
为什么要使用它?它显示了您的操作(如果出现错误,可以更轻松地进行反向操作)。为什么最后呢?这样您就可以n轻松删除它(或)。
奥利(Oli)

1
@nightcrawler您应该可以将完全独立的替换链接起来:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
Oli

10

这是一个纯bash解决方案:

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

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

如果要对多个字符执行此操作,则只需将它们放在字符类中即可。因此,举例来说,全部更换的;:=+%,用下划线,你可以这样做:

$ 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。因此,通过将要替换的所有字符放置在字符类中,可以一次处理所有这些字符。


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

$ 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

请注意,我对进行了转义\'并在每个前面"添加了\一个。


是否可以增强此功能以将几个单独的字符(例如Windows不能接受的所有字符)替换为其他字符?
萨迪2014年

1
@Sadi看到更新的答案。
terdon

基本上有九个:“ <>:” / \ | ?*“
Sadi 2014年

@Sadi看到更新的答案。
terdon

谢谢,这可以帮助创建Nautilus脚本,使所选文件的名称与Windows兼容。
萨迪2014年

2

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

sudo apt-get install pyrenamer

然后运行它:

pyrenamer

它具有多种模式和重命名格式的选项。


1

我更喜欢GUI,但作为Nautilus扩展,即Nautilus Actions Extra

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(请参阅www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html

然后,当您选择要重命名的文件并从上下文菜单中单击“重命名”时,会提供许多用于重命名文件的选项。


0

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

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

-f do选项将文本文件的格式设置为仅具有目标文件名,这使搜索和替换更为简单。默认格式在每行上都有文件名的两个副本,而您仅编辑第二个副本。如果您已删除或重新排序文件中的行,这使它可以执行正确的操作,但这并不总是最简单的。也有其他格式。

使用qmv,您可以选择通过自己选择的命令(例如)通过管道传输生成的文件sed,如果您不需要交互功能。


0

这是一个Nautilus脚本,它在所有选定的文件名中都用连字符替换(所有?)与Windows不兼容的字符(基于terdon的答案;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done

0

Thunar(XFCE文件管理器)具有用于批量重命名文件的出色内置功能。它具有删除/替换字符,搜索和替换,对文件编号等选项。

安装thunar:

sudo apt-get install thunar

打开thunar,浏览到您的文件,选择它们,然后选择“重命名”(通过上下文菜单或F2


0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit

效果很好,并带有可变提示...将文件命名为_ Truncate Last Characters.cmd
TekWiz2010

3
尽管这可能是正确的,但是它使用Windows批处理脚本语言。我们在AskUbuntu上,这是一个与Ubuntu相关的问题,以及与Ubuntu相关的工具的网站。我的观点是,此答案不一定适用于此。
Sergiy Kolodyazhnyy 2015年

您需要通过Wine来运行它,但是可能可以在Ubuntu上运行它。这只是一个奇怪的答案,所有人都可以。
奥利(Oli)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.