我想搜索多个子目录并将所有 .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