我有一堆文件需要重命名,但我不想为其创建脚本,只想创建一个命令行。
我需要删除.
和之间的最后几位数字.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
.gif
mv
这对于隐藏文件不起作用,以 开头.
。
答案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$
:
因此,点、最后的数字和后缀.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
它基本上说的是“用一个字符替换字符.
之间的所有内容”.
.