如何使用命令行轻松重命名多个文件?


103

我在Windows中快速重命名文件的方法之一是

F2 > Rename > Tab (to next file) > Rename ...

但是在Ubuntu / Nautilus中,我无法跳至下一个文件。但是在Linux上,我认为必须有命令行替代方案。

但是,有时,我可能希望对如何重命名特定文件有更多控制。在这种情况下,最好能跳至下一个文件


1
您可以定义“更多控制权”吗?不知道你要问究竟..
荡夸

我认为这个问题没有得到回答。我想在Nautilus中找不到您要的内容(F2,然后以F2模式跳转到下一个文件)。
don.joey

Answers:


187

rename一直都在用。这很简单,但是希望您了解基本的正则表达式:

rename "s/SEARCH/REPLACE/g"  *

这将替换字符串SEARCHREPLACE在每一个文件(也就是*)。该/g方法全球化的,如果你有一个SEARCH_SEARCH.jpg,它会被重新命名REPLACE_REPLACE.jpg。如果没有/g,它将只进行一次替换,因此现在命名为REPLACE_SEARCH.jpg。如果要不区分大小写,请添加/i(在末尾/gi/ig末尾)。

使用正则表达式,您可以做更多的事情。

请注意,这renameprename(aka Perl rename)命令,它支持完整的Perl正则表达式。还有一种rename使用模式,但功能不那么强大。prename曾经默认安装在Ubuntu(以及Perl)上,但是现在您可能需要执行以下操作:

sudo apt install rename

这里有一些例子:

字首

添加

rename 's/^/MyPrefix_/' * 
  • document.pdf 重命名为 MyPrefix_document.pdf

移除

您也可以删除不需要的字符串。假设您有20个名为like的MP3文件,CD RIP 01 Song.mp3并且想要删除“ CD RIP”部分,并且想用一个命令从所有文件中删除它。

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp301 Song.mp3

请注意,中有多余的空格'^CD RIP ',如果没有空格,则所有文件都会以空格作为文件的第一个字符。还要注意,这将在没有^字符的情况下起作用,但会与CD RIP 文件名的任何部分匹配。该^保证,如果他们是在文件的开头只删除字符。

后缀

添加

rename 's/$/_MySuffix/' *
  • document.pdf 重命名为 document.pdf_MySuffix

变更

rename 's/\.pdf$/.doc/' *

Something.pdf变成Something.doc。(反斜杠的原因是,.是regexp中的通配符,因此会.pdf匹配,qPDF\.pdf只会匹配完全匹配的字符串.pdf。要特别注意的是,如果您不熟悉BASH,则必须在单引号中加上反斜杠!您不得省略引号!或使用双引号,否则bash会尝试将其翻译成bash \. "\." equals .。(但使用双引号和反斜杠,例如对于换行符使用“ \ n”,但由于"\."它不是有效的后退序列,因此转换成.

实际上,您甚至可以将字符串的各部分用引号引起来,而不是将其引起来:与BASH 's/Search/Replace/g'相同。您只需要注意特殊字符(和空格)。s/'Search'/'Replace'/gs/Search/Replace/g


我建议-n您在不肯定时使用正确的正则表达式。它显示了将被重命名的内容,然后不做任何更改就退出了。例如:

rename -n s/'One'/'Two'/g *

如果您未将-n标记放在此处,它将列出它会进行的所有更改。如果看起来不错,请按Up返回,然后删除-n和按下Enter(或将其替换-v为输出所做的所有更改)。

注意rename默认情况下,17.04以上的Ubuntu版本不附带,但是在存储库中仍然可用。使用sudo apt install rename安装它


我将如何拥有一个“动态”后缀。像001-010等。可能吗?
孟梦

嗯..我试图写点东西,但是没有用。主要是因为,当我将001加1时,它加2,而不是002。否则,我可以只使用变量来保持数字位置,然后附加它。另外,我只是想起,在我不知道该命令之前rename,这就是我要附加的内容:for f in *; do mv -v "$f" "prependThis$f"; done
Matt

2
@jiewmeng是的。(?:\.[0-9]{3})$在您的模式中使用,它将与被动组中的所有3位数字文件扩展名匹配。范例:rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *。看看这个正则表达式备忘单
sergio91pt 2011年

@ sergio91pt这是一个不错的regex备忘单。但这是关于什么的?必须是perl-但在那里找不到这样的音符。
Adobe

@Adobe它是“基于Perl的正则表达式”的通用名称。查看有关+符号的注释以及有关POSIX字符类的列。
sergio91pt 2011年

21

尝试pyrenamer

它没有与鹦鹉螺集成,但是可以完成工作。是评论。

Thunar(XFCE的一部分)还具有一个重命名器,您可以单独运行它。

图纳尔批量重命名器


2
感谢您提及Thunar功能。如果您有Thunar,请在文件夹中选择文件,然后按F2。
最多

9

在启动板上似乎有一个名为nautilus-renamer的项目。您可以通过make install下载脚本并解压缩后运行来安装它。它似乎具有某些功能,或者如果您确实知道某些编程可能,则可以根据需要对其进行增强,因为它只是一个python脚本。

在此处输入图片说明


8

在命令行中,要重命名单个文件,该命令很简单

mv file1.txt file2.txt

如果要批量执行此操作,则可能需要通过脚本来执行。如果您提供更多详细信息,我或其他人可能会为您提供帮助。也就是说,将内容附加到文件的脚本可能如下所示:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

例如,如果您要遵循特定的重命名规则,则可能会根据您实际需要的方式对重命名的内容进行调整。(我个人会通过Perl脚本执行此操作,因为我的bash-foo并不怎么好,但这就是我。)

请注意,我将文件名和扩展名与先前提出的问题分开了。


7

如果您希望不使用命令行来执行此操作,与Windows中的操作类似,请使用向右箭头键而不是Tab键。就像Windows中的选项卡一样,这将选择下一个文件。


这是不一样的:您仍然需要按ENTER键完成重命名,使用箭头键移至下一个文件,并按F2重命名。重命名文件后,TAB只需一步即可完成。
MestreLion

@MestreLion但这与问题中描述的算法非常相似,不需要任何其他软件或命令行操作。有点用户友好。
2011年

是的,您是唯一尝试使用与原始问题相同的方法的答案。可悲的事实是,鹦鹉螺没有这种功能。您可以F2重命名,仅此而已。没有TAB可以在重命名模式下自动将您跳到下一个文件。
MestreLion,2011年

7

如何一次重命名多个文件不是一个完全相同的问题吗?但我将建议与该答案中建议的程序相同的程序:qmv

qmv是来自renameutils软件包的便捷工具。它使您可以使用自己喜欢的文本编辑器来重命名文件。结合vim的强大功能,您将拥有出色的重命名实用程序。

我通常像qmv -f do在要重命名一堆文件的目录中那样调用它。或者,如果我想递归重命名qmv -R -f do

每当我需要重命名多个文件时,我总是依靠qmv(和vim)。

http://www.nongnu.org/renameutils/


我只是根据您的建议尝试了此操作。如果您使用vim,这确实是最强大的工具!
ste_kwr 2014年

3

如果唯一合适的选择是手动重命名文件,那么一种很好的方法是使用vidir(在moreutils软件包中):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

例子


有选择地重命名文件

当前工作目录的内容:

.
├── bar
├── baz
└── foo

运行vidir,在包含要重命名文件名的行中重命名文件名;按CTRL+ OCTRL+ X

屏幕截图3

.
├── bar.bak
├── baz.old
└── foo.new

有选择地切换文件名

当前工作目录的内容:

.
├── bar
├── baz
└── foo

当前工作目录文件的内容:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

运行vidir,在包含您要切换的文件名的行中切换数字;按CTRL+ OCTRL+ X

屏幕截图4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

有选择地删除文件

当前工作目录的内容:

.
├── bar
├── baz
└── foo

运行vidir,删除包含您要删除的文件的行;按CTRL+ OCTRL+ X

屏幕截图2

.
└── baz

2

我正在使用krename。这是一个GUI应用程序。它可以读取mp3标签,等等。

它作为一个单独的应用程序存在,也作为Krusader的一部分存在。

还有一个rename脚本-这是标准perl安装的一部分(您可能已经安装了它)。用签出man rename

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.