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
我可以将此正则表达式命令通过管道传输到第二个引用的帖子中概述的后续命令中,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 命令不起作用的原因是您需要以.*
(“anything”的正则表达式语法) 开头,而不仅仅是*
(“anything”的 glob 语法)。你.
的扩展前面还有一个无关的东西。
find . -regex '.*\.\(mp3\|wav\|m4a\)' -print0
至于你的管道,它应该可以工作。通过echo
在 前面放置 来测试它ffmpeg
。我的本能是编写一个可以在一个文件上测试的函数或脚本,或者确保我的文件中没有换行符。空格是一回事,用户喜欢它们,但换行符却很痛苦。
答案2
您的正则表达式不起作用,因为那不是有效的正则表达式。
*
在正则表达式中不起作用。为了获得大致相同的行为,您需要.*
但通常不需要任何东西,因为正则表达式无论如何都是子字符串匹配。
您还需要转义任何.
您想要匹配的文字 - 因为否则它意味着任何字符。因为你逃脱了第一个.
而不是第二个,所以你实际上匹配。
.?mp3
我认为你不太可能拥有。
所以:
find -regex '\.(mp3|wav|m4a)$'
可能会成功。
我不知道为什么你的第一个模式不起作用,因为我现在不在 Unix 系统上进行双重检查。但我猜这是因为它-print0
应用于最后一项,而不是全部。无论如何,你的第一个例子 - 是否有任何wav
文件正在打印?
因为您可能需要括号:
find \( -name '*.wav' -o -name '*.mp3' -o -name '*.m4a' \) -print0