如何使用命令行从文件名中删除字符?

如何使用命令行从文件名中删除字符?

我有一堆文件需要重命名,但我不想为其创建脚本,只想创建一个命令行。

我需要删除.和之间的最后几位数字.gif

22771786_01.204.gif  
22771786_02.203.gif  
22771786_03.10.gif  
22771786_04.56.gif

就像这样:

22771786_01.gif  
22771786_02.gif  
22771786_03.gif  
22771786_04.gif

答案1

您可以使用 for 循环和一些 bash 扩展来实现这一点。如果您已经位于包含文件的目录中:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

如果包含文件的目录名为 /home/gifstore/ :

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

${f...}将我们保存到名为 的变量中的每个文件名进行扩展。f文件%名扩展中的 表示从变量末尾删除以下模式的最短匹配。模式是,表示和.*.gif之间的任意数量的字符。最后,我们将文字字符串附加到扩展之外以创建新的文件名,并依靠命令移动文件。..gif.gifmv

这对于隐藏文件不起作用,以 开头.

答案2

rename命令(您也可以将其作为 运行file-rename)非常适合此任务。这里有几种使用它的方法。我建议这样做,不过我将在下面展示另一种方法:

rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif

-n选项使其首先打印出重命名操作。一旦您对此感到满意,请再次运行它而无需-n进行实际的重命名。的一个好处rename是它不会覆盖文件(除非您传递选项-f,但您很少这样做)。这在这里尤其有用,因为您要从文件名中删除可能导致命名冲突的部分。即使在使用 执行模拟时未检测到冲突-n,也会在执行实际重命名时捕获它们。

通过您展示的四个文件,该命令将显示以下输出:

rename(22771786_01.204.gif, 22771786_01.gif)
rename(22771786_02.203.gif, 22771786_02.gif)
rename(22771786_03.10.gif, 22771786_03.gif)
rename(22771786_04.56.gif, 22771786_04.gif)

当然,如果您有超过四个文件,您的输出将会更长,我想您确实有。


该命令的工作方式是s/执行替换。包含与正则表达式 ^\d{8}_\d\d\K\.\d+被改变,从而删除匹配项,即用位于其后的/和之间的空字符串替换。///

尽管正则表达式可以这样编写,以确保只对以 结尾的文件.gif进行操作,但这是不必要的,因为您可以只将.gif文件名传递给rename。 shell 会扩展*.gif为这些文件的列表,并将该列表传递给rename 命令。请注意语法shell 使用文件名扩展不是一回事作为常用表达. 的*含义与正则表达式中的含义不同。

正则表达式的作用如下^\d{8}_\d\d\K\.\d+

  • ^ 锚点到行首。
  • \d{8}火柴序列正好八个数字
  • _匹配文字_。它没有什么特殊之处。
  • \d\d匹配另外两个数字。
  • \K 忘记前面匹配的字符。毕竟,这些是我们要保留的字符,而不是我们想要替换的字符。效果是确保这些字符存在就在之前我们实际上要更换的部分。
  • \.匹配文字.。反斜杠是必需的,因为当正则表达式中出现点时,否则火柴任何单个字符
  • \d+匹配一个或多个数字

因此,后面跟着.被删除的数字。如果文件不是以必要的模式开头,则不匹配。这有助于避免重命名您不想重命名的文件。

可以编写一个更短的rename命令来工作。我选择了这种方法——许多可能的方法——因为命令精确地表达了您希望操作的命名方案。也就是说,解决方案类似于问题。


如果您想使用更简单的rename命令,并且您知道.gif 当前目录中的所有文件都是按照您的描述命名的并且需要重命名,那么您可以使用:

rename -n 's/\.\d+\.gif$/\.gif/' *

请记住,这-n只是向您展示将要执行的操作,然后您必须将其删除才能实际重命名文件。

在该命令中,我在正则表达式中包含了后缀.gif,因此您不必在传递给 的文件名中对其进行过滤。不过,如果当前目录中rename有许多非 的文件,而 又无意义地匹配 ,那么您可能还是会选择这样做。.gif*

正则表达式的作用如下\.\d+\.gif$

  • \.匹配文字.。(如果没有\,则 a.匹配任意字符
  • \d+匹配一个或多个数字
  • \.匹配另一个文字.
  • gif与文字文本匹配gif
  • $ 锚点比赛结尾文件名。

因此,点、最后的数字和后缀.gif都匹配,并且全部替换为.gif

答案3

我个人喜欢使用游侠处理这类事情。它使用 Vim 键绑定进行导航等,因此如果您不熟悉 vim,可能会感到困惑/困难。但如果​​你已经熟悉 Vim,这应该是一个简单的任务!

步骤1

安装ranger。您可以将其安装为Vim 插件或者直接从网站

第2步

运行 Ranger 并导航到包含要重命名的文件的目录。我建议将所有 .gif 放在一个目录中。确保除了要重命名的文件外没有其他文件。

步骤3

按下v选择所有文件

步骤4

键入:bulkrename并按下Enter

步骤5

使用 Vim 宏来记录您想要进行的更改。例如,如果您从文件的第一行开始,则可以使用以下命令:

q a(这将启动名为“a”的宏)

0,,f.de将光标移动到行首,找到第一个“。”,然后删除到 gif 前第二个“。”之前的最后一个字符)

q(停止录制宏)

第 6 步

移至第二行并将光标移动到行首(j, 0)并输入:2,$norm! @a

这将从第二行一直运行您刚刚创建的宏(名为“a”)直到文件末尾。

步骤7

:wq保存并退出,然后:wq再次确认更改。


因此,如果一切顺利,您应该已经重命名了所有文件。如果您以前没有使用过 Vim,我建议您使用另一种方法,这样您就不必学习 Vim 来重命名文件。我更喜欢使用 Vim,所以这是我批量重命名时的首选方法。

答案4

rename 's/\..*\./\./' *.gif

它基本上说的是“用一个字符替换字符.之间的所有内容”..

相关内容