SYYANI's BLOG

一些唠叨

shell批量操作指南

产生需求:linux环境下对同一文件夹下同一格式的文件批量处理
———使用ffmpeg抽取mp4视频文件中的音频保存为m4a格式
需要对文件夹所有文件进行操作,故关联到批量重命名命令

1
2
3
4
5
6
7
8
9
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `ls|grep glyphicons`
do
newName=`echo $i |cut -d _ -f3`
mv $i $newName
done
IFS=$SAVEIFS

上述代码实现的功能是对文件名形似 glyphicons数字_字符串.png 的文件去除斜体的部分的实现,参考 cut 手册知道 -d 参数用于自定义分隔符,例如上述文件名中存在两处 “__” 下划线,可被分隔符分为3块,配合 -f 参数使用选择被划分的第三块区域,实现目的。
回到需求,命令涉及到对文件后缀名的更改,需要获取文件名中去除后缀名的部分作为新文件的标识,所以 -d 可搭配 “.” 使用 ,再选取合适的划分区域作为 -f 的参数即可,注意文件名中可能会出现 “.” 标识符,故取 -f1 取第一部分作为文件名前缀满足标识需求。
例:抽取example.mp4文件中的音频保存为example.m4a
对单一文件通过ffmpeg工具实现:ffmpeg -i example.mp4 -vn -y -acodec copy example.m4a
则批量处理方法如下:

1
2
3
4
5
6
7
8
#!/bin/bash
for i in `ls|grep mp4`
do
name=`echo $i |cut -d . -f1`
suffix='.m4a'
newName=$name$suffix
ffmpeg -i $i -vn -y -acodec copy $newName
done

但是上述方法没有考虑到文件名中包含空格的情况,作如下处理即可

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in `ls|grep mp4`
do
name=`echo $i |cut -d . -f1`
suffix='.m4a'
newName=$name$suffix
ffmpeg -i $i -vn -y -acodec copy $newName
done
IFS=$SAVEIFS

补:chmod a+x example.sh 赋予文件可执行权限

Proudly powered by Hexo and Theme by Hacker
© 2023 SYYANI