当前位置: 首页>>技术问答>>正文


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

, ,

问题描述

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

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

但在Ubuntu /Nautilus中,我无法选择下一个文件。但是在Linux上,我认为必须有一个命令行选择。

但是,有时,我可能想要更多地控制如何重命名特定文件。在这种情况下,或许最好能够选中下一个文件

最佳解决方案

我一直使用rename。这很简单,但希望你知道基本的正则表达式:

rename "s/SEARCH/REPLACE/g"  *

这将在每个文件(即*)中用REPLACE替换字符串SEARCH/g表示全局,所以如果你有一个SEARCH SEARCH.jpg,它将被重命名为REPLACE REPLACE.jpg。如果您没有/g,它只会进行一次替换,因此现在名为REPLACE SEARCH.jpg。如果您需要大小写敏感,请添加/i(即最后的/gi/ig)。

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

请注意,此renameprename(又名Perl rename)命令,它支持完整的Perl正则表达式。还有另一种使用模式的rename,并没有那么强大。 prename默认安装在Ubuntu上(与Perl一起)。


这里有一些例子:

Prefix

加:

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

去掉:

你也可以删除不需要的字符串。假设您有20个名为CD RIP 01 Song.mp3的MP3文件,并且您希望删除”CD RIP”声部,并且您希望使用一个命令将其删除。

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

注意'^CD RIP '中的额外空间,没有空格的话,所有文件都会有空格作为文件的第一个字符。另请注意,这将在没有^字符的情况下工作,但会在文件名的任何部分匹配CD RIP ^保证只删除字符,如果它们是文件的开头。

Suffix

加:

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

更改:

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

会将Something.pdf更改为Something.doc。 (反斜杠的原因是,.是正则表达式中的通配符,所以.pdfqPDF匹配,而\.pdf只匹配确切的字符串.pdf。同样非常重要的一点是,如果您不熟悉BASH,则必须在单引号中加反斜杠!您可能不会省略引号或使用双引号,否则bash会尝试翻译它们。bash \."\."等于.(但使用double-quotes和反斜线,例如”\n”用于换行符,但由于"\."不是有效的后面它转换成.)

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


我建议在不正确的情况下使用-n选项,以获得正确的正则表达式。它显示了什么会被重命名,然后退出而不做它。例如:

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

这将列出它所做的所有更改,如果您没有将-n标志放在那里。如果看起来不错,请按Up返回,然后擦除-n并按下Enter(或将其替换为-v以输出它所做的所有更改)。

次佳解决方案

试试pyrenamer

它没有与 nautilus 集成,但它完成了工作。 Here是一个评论。

Thunar(XFCE的一部分)也有一个可以单独运行的重命名器。

command-line,rename,ubuntu

第三种解决方案

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

command-line,rename,ubuntu

第四种方案

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

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并不好,但那只是我。)

请注意,我从a previously asked question中分离了文件名和扩展名。

第五种方案

如果你想在没有命令行的情况下执行此操作,与在Windows中执行的操作类似,请使用右箭头键而不是制表键。这将选择下一个文件,就像Windows中的选项卡一样。

第六种方案

How can rename many files at once?不完全相同的问题,但我会建议我在该答案中提出的同一个程序:qmv。

qmv是renameutils软件包中的一个便利工具。它使您能够使用您最喜爱的文本编辑器来重命名文件。结合vim的强大功能,您可以拥有出色的重命名实用程序。

我通常在dir中调用它,如qmv -f do,我想重命名一堆文件。或者如果我想递归重命名qmv -R -f do

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

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

第七种方案

如果唯一合适的选项是手动重命名文件,则最好的方法是使用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

command-line,rename,ubuntu

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

有选择地切换文件名

当前工作目录的内容:

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

当前工作目录’s files’内容:

$ 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

command-line,rename,ubuntu

.
├── 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

command-line,rename,ubuntu

.
└── baz

第八种方案

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

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

还有一个rename脚本 – 它是标准perl安装的一部分(您可能已安装它)。用man rename检查一下。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/689.html,未经允许,请勿转载。