目标
有很多视频文件需要按照文件名尽力对应文件夹进行归档,文件格式如下
LC001-2021-11-01-10:41:59-discription.mp4
LC073-2021-11-01-17:04:32-discription with space.mp4
需要归档为如下结构
├── CASE_LC001
│ └── video
│ └── LC001-2021-11-01-10:41:59-discription.mp4
└── CASE_LC073
└── video
└── LC073-2021-11-01-17:04:32-discription with space.mp4
其中部分文件名含有空格
实现
Python
第一反应采用pytohn脚本glob库获取文件名,使用split进行分割提取字段,最后调用os.system执行mkdir与mv完成文件操作。
代码如下
#!/usr/bin/python3
import os,glob
files = glob.glob("*.mp4")
case = ["-".join(f.split("-")[:2]) for f in files]
for c in case:
path = "CASE_"+c+"/video"
os.system("mkdir -p "+path)
os.system("mv "+c+"*.mp4 "+path)
简化为一行格式方便命令行调用
python3 -c 'import os,glob;[os.system("mkdir -p CASE_"+c+"/video && mv "+c+"*.mp4 "+"./CASE_"+c+"/video") for c in ["-".join(f.split("-")[:2]) for f in glob.glob("*.mp4")]]'
Shell
由于文件名含有空格,部分含有空格的$file
变量需要特殊处理,加上双引号
for file in *.mp4;do mkdir -p CASE_${file%-2021*}/video;mv "$file" $_;done
循环体中的${file%-2021*}
表示对file变量进行操作,%
代表删除右侧与正则表达式-2021*
匹配部分。
处理过程中发现$!
返回上一次命令的最后一个参数,会在命令首次执行时被赋值,例如
$ set 1
$ set 2;echo !$
set 2;echo 1
1
而使用$_
才能正确捕获每次前一句命令的最后一个参数,每次更新
$ set 1
$ set 2;echo $_
2