
複数のサブディレクトリを検索し、すべての.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