在 sox 处理后使用大括号扩展为 bash 中的输出文件添加前缀

Prefixing an output file in bash with brace expansion after sox processing

给定 Ubuntu 16.04 服务器上混合文件的几个子目录,我想获取所有名为 1.al2.al 等的子目录,处理它们,保留原始文件, 并在生成的文件前加上 quick_。所以我有这个...

find . -name '[[:digit:]]*.al' -print0 | xargs -0 -I {} sh -c 'for f; do sox  -c1 --rate 8k "$f" -e a-law "quick_${f}" tempo -q -s 1.5; done' sh {}

但是我明白了

can't open output file `quick_./1.al': No such file or directory

我明白为什么会这样,我觉得答案在于大括号展开。我找到了去除和添加后缀的方法,但前缀答案让我望而却步。谢谢。

这里没有太多内容可以继续,但我认为您想使用 basename 命令来获取文件名:

find . -name '[[:digit:]]*.al' -print0 | xargs -0 -I {} sh -c 'for f; do sox  -c1 --rate 8k "$f" -e a-law "$(dirname "$f")/quick_$(basename "$f")" tempo -q -s 1.5; done' sh {}

就我个人而言,我发现使用 -exec 标记到 find 会更容易一些。这是一个少一级的间接担心。 {} 代表文件名,命令以 ; 终止(转义所以 shell 不会抓住它。)

find . -name '[[:digit:]]*.al' -exec sh -c 'sox -c1 --rate 8k "{}" -e a-law "$(dirname "{}")/quick_$(basename "{}")" tempo -q -s 1.5' \;