Loading

Shell脚本实现自动文件分类

目标

有很多视频文件需要按照文件名尽力对应文件夹进行归档,文件格式如下

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
posted @ 2021-11-06 20:27  azureology  阅读(570)  评论(0编辑  收藏  举报