如何使用FIND命令处理文件名空间和字符

时间:2018-05-21 12:25:21

标签: bash find

美好的一天, 我正在使用bash脚本将多个mp3文件合并为一个。代码工作正常但无法处理带有空格或字符的文件名。下面是代码。你能告诉我我做错了吗?感谢

for file in $(find . -type f -name "*.mp3" -print0 | xargs -0 ); do
  ffmpeg -i "concat:intro.mp3|"$file"|outro.mp3" -acodec copy "${file%.mp3}-".mp3;
done

3 个答案:

答案 0 :(得分:2)

使用-d读取内置后跟空参数以使用NUL caracter作为输入记录分隔符

while IFS= read -r -d '' file; do
    ffmpeg -i "concat:intro.mp3|$file|outro.mp3" -acodec copy "${file%.mp3}-".mp3;
done < <(find . -type f -name "*.mp3" -print0)

答案 1 :(得分:2)

find有一个-exec标志,允许您使用搜索结果调用脚本。

e.g。创建一个简单的帮助程序脚本addxtros.sh:

#!/bin/sh
infile=$1
outfile=${infile%.mp3}-.mp3 
ffmpeg -i "concat:intro.mp3|${infile}|outro.mp3" -acodec copy "${outfile}"

您可以像:

一样使用它
find . -type f -name "*.mp3" -exec ./addxtros.sh {} ";"

答案 2 :(得分:1)

您可以将findbash -c命令一起使用(允许将2个参数传递给ffmpeg):

 find . -type f -name "*.mp3" -exec bash -c 'ffmpeg -i "concat:intro.mp3|$1|outro.mp3" -acodec copy "${1%.mp3}-.mp3"' _ {} \;