zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    重构FourlegLayers控件
    XNA 没有经过Content Pipeline对内容做Alpha预处理解决办法
    山寨DNF
    XNA中 SpriteSortMode 与 BlendState 《摘自王磊文章》
    HDU1060 Leftmost Digit
    HDU1095 A hard puzzle
    magento安装心得
    关于小米手机网站抢购的一点技术分析
    MVC3和MVC4内置Razor引擎的差异
    查看进程
  • 原文地址:https://www.cnblogs.com/azureology/p/15518287.html
Copyright © 2011-2022 走看看