Bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell,执行bash命令可以完成对于linux系统的操作。有一些实用的bash命令记录如下:
1. 通过find加管道与while可以列出并逐个目录中的所有被搜索到的文件
例如假设当前文件夹中有a.rmvb, b.rmvb, c.rmvb, a.mp4, c.mp4,执行下述命令
find . -name \*.rmvb | while read i; do echo $i; done
将会产生如下输出
./a.rmvb
./b.rmvb
./c.rmvb
2. basename命令可以提取上述路径中的文件名
find . -name \*.rmvb | while read i; do echo `basename $i`; done
将会产生如下输出
a.rmvb
b.rmvb
c.rmvb
3. 使用%(%%)从右向左或者#(##)从左向右匹配删除通配符动作后方的字符串。
比如
find . -name \*.rmvb | while read i; do echo ${i%.*}.mp4; done
将会产生如下输出
./a.mp4
./b.mp4
./c.mp4
%%和##是%和#的贪婪模式。非贪婪模式为按照动作方向匹配到第一个即停止,贪婪模式为按动作方向匹配到最后一个才停止。
因此,若执行下述命令
find . -name \*.rmvb | while read i; do echo `basename ${i%.*}.mp4`; done
将产生如下输出
a.mp4
b.mp4
c.mp4
ls | grep rmvb | while read i; do echo ${i%.*}.mp4; done
也能产生相同的输出
/* ***************************分**割**线********************************** */
用上述的find|while或者ls|grep|while命令不能很好的进行批处理,如果将其换成下述命令则可以完美进行批处理
for FILE in *.rmvb; do ffmpeg -i $FILE -acodec libfdk_aac -vcodec h264 ${FILE%.*}.mp4; done
注:使用上面的命令时,如果文件名($FILE)中有空格(比如aaa bbb.rmvb)的话执行这行命令会返回一个文件不存在的报错。只要像下面的命令一样在把文件名用双引号包含起来就行了。
for FILE in *.rmvb; do ffmpeg -i "$FILE" -acodec libfdk_aac -vcodec h264 "${FILE%.*}.mp4"; done