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