この find コマンドが機能しないのはなぜですか? .mp3、.wav、および.m4aファイルを見つけるための正規表現とバリアント

この find コマンドが機能しないのはなぜですか? .mp3、.wav、および.m4aファイルを見つけるための正規表現とバリアント
2015.10.25 Move on and Be Blessed.wav             dummy.m4a
2015.11.17 BS Full.wav.mp3                        
2015.11.17 BS MOL.wav.mp3           

find . -name '*.mp3' -o -name '*.wav' -o -name '*.m4a' -print0

しかし、このコマンドは機能します find . -name "*.wav" -o -name '*.mp3' -print0

私は読んでいた find コマンドを使用して複数の拡張子を検索する方法そして neroAacEncを使用してサブディレクトリ内のすべての.wavファイルを.aacに変換するには?

私の正規表現バージョンが機能しないのはなぜですか? find . -regex '*\.\(.mp3\|.wav\|.m4a\)' -print0 この正規表現コマンドを2番目の参照記事で説明されている後続のコマンドにパイプして、find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; doneそのfind . -name "*.wav" -print0コマンドを置き換えることはできますか?

答え1

あなたの質問に始めが欠けているようですが、find-regexコマンドが機能しないのは、.*(「何でも」のglob構文)だけでなく*(「何でも」の正規表現構文)で始める必要があるからです。.Extensionの前に不要なものがあります。

find . -regex '.*\.\(mp3\|wav\|m4a\)' -print0

パイプラインは正しく機能します。echoそれを前に配置してテストしてくださいffmpeg。私の本能は、ファイルでテストできる関数やスクリプトを作成するか、ファイルに改行文字がないことを確認することです。スペースはユーザーが好きですが、改行は痛いです。

答え2

有効な正規表現ではないため、正規表現は機能しません。

*正規表現では動作しません。ほぼ同じ動作を得るために必要です.*が、正規表現はとにかく部分文字列の一致であるため、通常は何も必要ありません。

.また、一致させるリテラルをエスケープする必要があります。そうでなければ、すべての文字を意味するからです。 1回目は避け、.2回目は避けたから実際にマッチ。

.?mp3

私はあなたがそうではないと思います。

だから:

find -regex '\.(mp3|wav|m4a)$' 

成功することもできます。

私は現在Unixシステムを使用していないので、最初のパターンが機能しない理由がわかりません。しかし、それは-print0すべてではなく、最後の項目に適用されるためだと思います。とにかく、最初の例 -wav印刷されるファイルはありますか?

括弧が必要な場合があります。

find \( -name '*.wav' -o -name '*.mp3' -o -name '*.m4a' \) -print0 

関連情報