重命名使用每个单词的前两个字母的文件

重命名使用每个单词的前两个字母的文件

我目前正在使用一个简单的脚本进行重命名:

for f in *.mp4; do 
    echo mv $f $RANDOM$RANDOM$RANDOM.mp4;
    mv $f $RANDOM$RANDOM$RANDOM.mp4; 
done

但是我不想使用$random,而是想取每个单词的前两个字母。

例子

重命名之前:

having the best day.jpeg

重命名后:

hathbeda.jpeg

好吧,有点棘手 :) 我的文件名大多以 . 分隔单词。那么还能这样做吗?

答案1

您可以使用单个rename命令执行此操作(即,您不需要bash为此使用脚本,或者您可以在脚本中使用此命令bash代替循环for):

rename -n 's/(^| )([^ ]{1,2})[^ ]*/$2/g; s/$/.mp4/' *.mp4

这只是模仿的行为echo mv [...],以便您无需实际重命名任何内容即可看到结果。

如果结果是预期的,则运行:

rename 's/(^| )([^ ]{1,2})[^ ]*/$2/g; s/$/.mp4/' *.mp4

指令分解

  • renamePCRE:使用s重命名多个文件
  • *.mp4:仅重命名扩展名的文件.mp4

正则表达式 #1 解析

  • s:执行替换
  • /: 启动正则表达式
  • (:开始对允许的字符串进行分组
  • ^: 匹配行首
  • |: 分隔第二个允许的字符串
  • : 匹配一个字符
  • ):停止对允许的字符串进行分组
  • (:开始第二个捕获组
  • [^ ]{1,2}:匹配 1 到 2 个任意字符,而不是
  • ):停止第二个捕获组
  • [^ ]*: 匹配任意数量的字符,而不是
  • /:停止正则表达式/开始替换
  • $2: 替换为第二个捕获组
  • /:停止替换
  • g:替换行中出现的所有模式

正则表达式 #2 解析

  • s:执行替换
  • /: 启动正则表达式
  • $: 匹配行尾
  • /:停止正则表达式/开始替换
  • .mp4:添加一个.mp4字符串
  • /:停止替换

答案2

使用python

#!/usr/bin/env python2
import glob, os
for filename in glob.glob('*.jpeg'):
    first = filename.split('.')
    second = first[0].split(' ')
    name = ''
    for i in range(0, len(second)):
        name += second[i][:2]
    os.rename(filename, name + '.' + first[1]
  • first是包含文件名各部分的列表(假设文件名中.只有一个).

  • second.是包含以空格分隔的文件名的列表。

  • 接下来,我们遍历内容,second取出前两个字符,然后将它们相加,得到新文件名的第一部分

  • 然后我们通过在末尾os.rename添加来相应地重命名文件。.jpegname

还要注意,目标文件必须事先不存在,如果存在,它将被覆盖。

测试:

$ ls -1
foo.jpeg
having the best day.jpeg
hello kitty cat spam.jpeg
this is a doggy.jpeg

后:

$ ls -1
fo.jpeg
hathbeda.jpeg
hekicasp.jpeg
thisado.jpeg

相关内容