Ubuntu shell 大括号扩展 - 与 sox 命令的混淆

Ubuntu shell 大括号扩展 - 与 sox 命令的混淆

我想搜索多个子目录并将所有 .mp3 文件转换为 .al 文件。我是这样做的:

find . -name '*.mp3' -type f -print0 | xargs -0 -t -r -I {} sox {} -r 8000 -c1 -e a-law {}.al lowpass 4000 compand 0.02,0.05 -60,-60,-30,-10,-20,-8,-5,-8,-2,-8 -8 -7 0.05

但这留给我的文件为 filename.mp3.al,所以我这样做:

rename 's/.mp3.al$/.al/' ./**/*.mp3.al

似乎有点笨拙,但我不知道如何进行扩展以删除旧的 .mp3 扩展名。

(以防万一有人想知道,这是在 Asterisk 13.8.2 PBX 系统上使用的。我知道它有自己的内置转换器,也可以播放 mp3,但这两种解决方案都不如本地 alaw 好! )

答案1

AFAIK,在这种情况下,它们{}并不是真正的“壳大括号”(在某种意义上大括号扩展例如),它们只是参数的文本占位符。因此,您可以将它们传递到 shell 命令中,并使用 shell 的参数替换工具来修改名称,例如

sh -c 'for f; do somecommand "$f" "${f%.*}.al"; done' sh {}

为了用更简单的命令来说明,给出

$ tree
.
├── dir
│   ├── other file.mp3
│   └── some file.csv
├── other file.txt
└── some file.mp3

1 directory, 4 files

然后

$ find . -name '*.mp3' -print0 | xargs -0 -I {} sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {}
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al

或(如果您的系统find支持)

$ find . -name '*.mp3' -exec sh -c 'for f; do printf "%s --> %s\n" "$f" "${f%.*}.al"; done' sh {} +
./dir/other file.mp3 --> ./dir/other file.al
./some file.mp3 --> ./some file.al

相关内容