Bash脚本将操作应用于find找到的每个文件

时间:2014-07-05 08:17:06

标签: bash

我尝试对find找到的每个文件执行操作 - 使用特定的文件扩展名(wma)。例如,在python中,我只需编写以下脚本:

for file in os.listdir('.'):
    if file.endswith('wma'):
        name = file[:-4]
        command = "ffmpeg -i '{0}.wma' '{0}.mp3'".format(name)
        os.system(command)

我知道我需要执行类似于

的操作
find -type f -name "*.wma" \
    exec ffmpeg -i {}.wma {}.mp3;

但显然这不起作用,否则我不会问这个问题=]

2 个答案:

答案 0 :(得分:2)

坚持基础知识总能完成工作(不处理文件名中的空格):

for f in $(find "." -type f -name "*.wma"); do ffmpeg -i "$f" "${f//wma/mp3}"; done

从下面的konsolebox建议开始,我想出了这个完整版本:

find "." -type f -name "*.wma" | while read -d $'\n' f; do ffmpeg -i "$f" "${f//wma/mp3}"; done

答案 1 :(得分:2)

大多数情况下,解析输入时使用read比使用for进行单词拆分并依赖IFS更好,因为存在意外路径名的风险扩展

while IFS= read -u 4 -r LINE; do
    ffmpeg -i "$LINE" "${LINE%.*}.mp3"
done 4< <(exec find -type f -name '*.wma')

或使用readarray(Bash 4.0 +)

readarray -t FILES < <(exec find -type f -name '*.wma')

for FILE in "${FILES[@]}"; do
    ffmpeg -i "$FILE" "${FILE%.*}.mp3"
done