需求是这样的
在当前目录下有一些子目录,子目录下有一些wav文件,我的需求是把它们转为mp3
find命令实现查找所有wav文件
$ find -type f -name "*.wav"
./EXdata/NOSE/hoiku_Tr01_NoSE.wav
./EXdata/NOSE/hoiku_Tr02_NoSE.wav
./EXdata/NOSE/hoiku_Tr03_NoSE.wav
./EXdata/NOSE/hoiku_Tr04_NoSE.wav
./EXdata/NOSE/hoiku_Tr05_NoSE.wav
./EXdata/NOSE/hoiku_Tr06_NoSE.wav
./EXdata/NOSE/hoiku_Tr07_NoSE.wav
./EXdata/NOSE/hoiku_Tr08_NoSE.wav
./本編/hoiku_Tr00.wav
./本編/hoiku_Tr01.wav
./本編/hoiku_Tr02.wav
./本編/hoiku_Tr03.wav
./本編/hoiku_Tr04.wav
./本編/hoiku_Tr05.wav
./本編/hoiku_Tr06.wav
./本編/hoiku_Tr07.wav
./本編/hoiku_Tr08.wav
遍历它们就可以做想做的操作了,像这样
$ find -type f -name "*.wav"|while read filename
> do
> echo "$filename"
> done
./EXdata/NOSE/hoiku_Tr01_NoSE.wav
./EXdata/NOSE/hoiku_Tr02_NoSE.wav
./EXdata/NOSE/hoiku_Tr03_NoSE.wav
./EXdata/NOSE/hoiku_Tr04_NoSE.wav
./EXdata/NOSE/hoiku_Tr05_NoSE.wav
./EXdata/NOSE/hoiku_Tr06_NoSE.wav
./EXdata/NOSE/hoiku_Tr07_NoSE.wav
./EXdata/NOSE/hoiku_Tr08_NoSE.wav
./本編/hoiku_Tr00.wav
./本編/hoiku_Tr01.wav
./本編/hoiku_Tr02.wav
./本編/hoiku_Tr03.wav
./本編/hoiku_Tr04.wav
./本編/hoiku_Tr05.wav
./本編/hoiku_Tr06.wav
./本編/hoiku_Tr07.wav
./本編/hoiku_Tr08.wav
文件名不需要改变,只要后缀改为mp3即可,使用变量的字符串截取实现,也就是对$filename
变量操作,像这样
${filename:2:-4}
截取第2位到-4位,也就是去掉前面的./和后面的.wav
$ find -type f -name "*.wav"|while read filename; do echo "${filename:2:-4}"; done
EXdata/NOSE/hoiku_Tr01_NoSE
EXdata/NOSE/hoiku_Tr02_NoSE
EXdata/NOSE/hoiku_Tr03_NoSE
EXdata/NOSE/hoiku_Tr04_NoSE
EXdata/NOSE/hoiku_Tr05_NoSE
EXdata/NOSE/hoiku_Tr06_NoSE
EXdata/NOSE/hoiku_Tr07_NoSE
EXdata/NOSE/hoiku_Tr08_NoSE
本編/hoiku_Tr00
本編/hoiku_Tr01
本編/hoiku_Tr02
本編/hoiku_Tr03
本編/hoiku_Tr04
本編/hoiku_Tr05
本編/hoiku_Tr06
本編/hoiku_Tr07
本編/hoiku_Tr08
加上.mp3
后缀就是这样
$ find -type f -name "*.wav"|while read filename; do echo "${filename:2:-4}.mp3"; do
ne
EXdata/NOSE/hoiku_Tr01_NoSE.mp3
EXdata/NOSE/hoiku_Tr02_NoSE.mp3
EXdata/NOSE/hoiku_Tr03_NoSE.mp3
EXdata/NOSE/hoiku_Tr04_NoSE.mp3
EXdata/NOSE/hoiku_Tr05_NoSE.mp3
EXdata/NOSE/hoiku_Tr06_NoSE.mp3
EXdata/NOSE/hoiku_Tr07_NoSE.mp3
EXdata/NOSE/hoiku_Tr08_NoSE.mp3
本編/hoiku_Tr00.mp3
本編/hoiku_Tr01.mp3
本編/hoiku_Tr02.mp3
本編/hoiku_Tr03.mp3
本編/hoiku_Tr04.mp3
本編/hoiku_Tr05.mp3
本編/hoiku_Tr06.mp3
本編/hoiku_Tr07.mp3
本編/hoiku_Tr08.mp3
组合一下ffmpeg的命令,ffmpeg的命令是这样的ffmpeg -i filename.wav filename.mp3
,和上面的遍历操作,截取文件名操作组合起来,像这样
这里保留了echo,去掉它就是直接执行ffmpeg命令了,对于截取文件名还不确定的时候都建议echo看一下命令有没有问题
$ find -type f -name "*.wav"|while read filename; do echo ffmpeg -i "${filename:2}"
"${filename:2:-4}.mp3"; done
ffmpeg -i EXdata/NOSE/hoiku_Tr01_NoSE.wav EXdata/NOSE/hoiku_Tr01_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr02_NoSE.wav EXdata/NOSE/hoiku_Tr02_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr03_NoSE.wav EXdata/NOSE/hoiku_Tr03_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr04_NoSE.wav EXdata/NOSE/hoiku_Tr04_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr05_NoSE.wav EXdata/NOSE/hoiku_Tr05_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr06_NoSE.wav EXdata/NOSE/hoiku_Tr06_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr07_NoSE.wav EXdata/NOSE/hoiku_Tr07_NoSE.mp3
ffmpeg -i EXdata/NOSE/hoiku_Tr08_NoSE.wav EXdata/NOSE/hoiku_Tr08_NoSE.mp3
ffmpeg -i 本編/hoiku_Tr00.wav 本編/hoiku_Tr00.mp3
ffmpeg -i 本編/hoiku_Tr01.wav 本編/hoiku_Tr01.mp3
ffmpeg -i 本編/hoiku_Tr02.wav 本編/hoiku_Tr02.mp3
ffmpeg -i 本編/hoiku_Tr03.wav 本編/hoiku_Tr03.mp3
ffmpeg -i 本編/hoiku_Tr04.wav 本編/hoiku_Tr04.mp3
ffmpeg -i 本編/hoiku_Tr05.wav 本編/hoiku_Tr05.mp3
ffmpeg -i 本編/hoiku_Tr06.wav 本編/hoiku_Tr06.mp3
ffmpeg -i 本編/hoiku_Tr07.wav 本編/hoiku_Tr07.mp3
ffmpeg -i 本編/hoiku_Tr08.wav 本編/hoiku_Tr08.mp3
像下面这样就是直接执行了
$ find -type f -name "*.wav"|while read filename; do ffmpeg -i "${filename:2}"
"${filename:2:-4}.mp3"; done