我目前正在使用一个简单的脚本进行重命名:
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
指令分解:
rename
PCRE
:使用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
添加来相应地重命名文件。.jpeg
name
还要注意,目标文件必须事先不存在,如果存在,它将被覆盖。
测试:
前:
$ 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