for f in ./*.mp3; do sox "$f" "${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done
这是我用来处理音频文件的脚本。问题是它继续循环,处理新的音频文件。我想通过将输出放在子文件夹中来解决这个问题,所以我尝试了这个:
for f in ./*.mp3; do sox "$f" "/subfolder${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done
这是输出:
/subfolder./01processed.mp3
这给了我一个Sox的错误,我需要在文件名输出之前删除./,我该怎么做?这是我想要的输出:
/subfolder/01processed.mp3
答案 0 :(得分:1)
for f in *.mp3; do sox "$f" "/subfolder/${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done
答案 1 :(得分:0)
for f in ./*.mp3; do
out=${f#./}
out=${out%%.mp3}processed.mp3
sox "$f" "/subfolder/$out" silence 1 0.02 1% -1 0.02 1%
done
您可以删除前导./
和尾随mp3
,但参数扩展需要一次完成一个(它们不能嵌套)。你可能只删除前导.
并在构建输出路径时保留/
,但更明确地将其取出并明确地将其重新放回。 (/subfolder$out
没有明确说明文件放在名为subfolder
的文件夹中,而不是创建名为subfolder$out
的文件/文件夹。)
顺便说一下,for f in ./*.mp3
是最正确的版本,因为它适用于以-
开头的文件;否则,sox
可能会错误输入文件名作为选项。