我正在用音频文件做一些事情,大多数但不是全部都是 mp3 文件。现在我想只对不是 mp3 文件的文件运行一些命令,或者只对那些没有.mp3
扩展名的文件运行一些命令。
我认为自己非常擅长正则表达式,但不擅长文件通配,这在意想不到的方面略有不同。
我环顾四周,从其他 SO & SE 答案中了解到 Bash 具有“扩展的 globbing”,允许我这样做:
file ../foo/bar/*.!(mp3)
但是除了形成文件扩展名的文件名之外,我的一些文件名中还有点:
../foo/bar/Naked_Scientists_Show_19.10.15.mp3
../foo/bar/YWCS_ep504-111519-pt1_5ej4_41cc9320.mp3_42827d48daefaa81ec09202e67fa8461_24419113.mp3
../foo/bar/eLife_Podcast_19.09.26.mp3
../foo/bar/gdn.sci.080428.bg.science_weekly.mp3
似乎 glob 从第一个点开始匹配,而不是从最后一个点开始匹配。我查看了文档,但似乎它们远不如正则表达式强大。但是我并没有真正了解所有内容,因为我没有花太多时间在 *nix shell 上。
我是否错过了一些仍然可以使用 Bash globbing 执行此操作的方法?如果没有,使用 find 或其他工具实现相同目标的方法仍然值得了解。
*.!(mp3)
匹配 onfoo.bar.mp3
因为foo.
后面跟着bar.mp3
which is notmp3
。你想要
!(*.mp3)
在这里,它匹配任何不以.mp3
.如果您想匹配名称中至少包含一个文件
.
(除了会使它们成为隐藏文件的前导文件)但不以 . 结尾的文件.mp3
,您可以执行!(*.mp3|!(*.*))
.还有变量:_
GLOBIGNORE
我能想到的最简单的方法:
您在文件夹中找到所有文件并将其通过管道传输到反向扩展的 grep:
查找某个位置的所有文件
反向 grep 并使用正则表达式按扩展名过滤
Grep 标志:
-v
反向grep-E
扩展 grep(使用正则表达式)正则表达式解释:
.*
表示从 0 到任何字符数,任何可能的字符\.
寻找实际的点mp3
对于形成扩展名的字符串$
代表 EOL可能不适合您的情况,但我想知道如何在 pure 中创建一个函数,
Bash
然后将扩展作为 arg 传递,如果您想将它添加到您的中bashrc
并且您想在将来做同样的事情,这可能会很方便,像下面这样所以,基本上我们正在做的是对您想要的扩展进行正则表达式检查。
在函数中实现它:这将输出当前目录中具有特定扩展名的所有文件。
现在,例如要获取所有带有
mp3
扩展名的文件,它就像这样做一样简单:并获取没有特定扩展名的文件:这将输出当前目录中没有特定扩展名的所有文件。
同样,要获取没有
mp3
扩展名的文件,只需执行以下操作:欲了解更多信息:
https://stackoverflow.com/questions/407184/how-to-check-the-extension-of-a-filename-in-a-bash-script
https://stackoverflow.com/questions/18278990/easyest-way-to-check-for-file-extension-in-bash/18280350