Ubuntuシェル中括弧拡張 - soxコマンドと混同

Ubuntuシェル中括弧拡張 - 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も再生できることを知っていますが、両方のソリューションは基本的な法律ほど良くありません!)

ベストアンサー1

AFAIK、この場合は{}実際には「シェル中括弧」ではありません(意味では)。支柱の拡張例)パラメータのテキストプレースホルダのみです。したがって、これをシェルコマンドに渡し、シェルの引数置換機能を使用して名前を変更できます。

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

おすすめ記事