私はBashに比較的慣れていないため、表面上は非常に簡単に思える何かを実行しようとしています。ディレクトリ階層全体でfindを実行して、すべての* .wmaファイルを取得し、その出力をコマンドにパイプして、mp3に変換します。変換したファイルを.mp3として保存します。私の考えは、コマンドは次のようになるはずだと考えていました(オーディオ変換コマンドは省略し、代わりに説明のためにエコーを使用しています)。
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
私が理解しているように、-print0引数を使用すると、スペースを含むファイル名を処理できます(これらの多くは、音楽ファイルであるので、これを行います)。次に、(xargsの結果として)findからの各ファイルパスがfにキャプチャされ、文字列の最後から部分文字列の一致/削除を使用すると、mp3で元のファイルパスをエコーする必要があることを期待していますwmaの代わりに拡張子。ただし、この結果の代わりに、次のように表示されます。
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
だから私の質問(特定の「ここで何が間違っているのか」を除いて)はこれです-パイプ操作の結果である値は、変数割り当ての結果である値とは異なる文字列操作操作で処理する必要があります?
{}
メンバーなど)に対して文字列操作を実行できる限り
xargs
は、より適切なエッジケースがありますexec
。適例については、このスタックポストstackoverflow.com/questions/896808/find-exec-cmd-vs-xargsを参照してください。
xargs
する理由はありませんfind
。-exec
オプションで付属しています。使用するコマンドを質問に追加するだけで、誰かが正しいfind
コマンドを見せてくれますか?