Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用regex在MacOS终端中删除基于扩展名的文件?_Regex_Bash_Terminal - Fatal编程技术网

如何使用regex在MacOS终端中删除基于扩展名的文件?

如何使用regex在MacOS终端中删除基于扩展名的文件?,regex,bash,terminal,Regex,Bash,Terminal,我需要从我的项目根文件夹中删除大量的.zip和.apk文件,我想使用bash终端(MacOS X)来完成 到目前为止,我已经成功地使用了两个命令: $ find . -name \*.zip -delete $ find . -name \*.apk -delete 但我想使用正则表达式在一个中完成: $ find . -regex '\w*.(apk|zip)' -delete 但是这个正则表达式似乎不起作用,因为它正在删除任何内容。。。我做错了什么 更多信息: 我想删除的一个例子是and

我需要从我的项目根文件夹中删除大量的
.zip
.apk
文件,我想使用bash终端(MacOS X)来完成

到目前为止,我已经成功地使用了两个命令:

$ find . -name \*.zip -delete
$ find . -name \*.apk -delete
但我想使用正则表达式在一个中完成:

$ find . -regex '\w*.(apk|zip)' -delete
但是这个正则表达式似乎不起作用,因为它正在删除任何内容。。。我做错了什么

更多信息: 我想删除的一个例子是
android~1~1~sampleproject.zip

$ find -E . -regex './[~a-zA-Z0-9]+\.(apk|zip)' -delete
  • find
    尝试匹配整个文件名。因此,有必要使用
    /

  • 我相信
    find
    不支持
    \w
    \d
    等。所以用字符类替换它们。但是
    find
    也不支持它们,因此需要添加
    -E
    以启用扩展正则表达式

    -E将紧跟-regex和-iregex原色的正则表达式解释为扩展(现代)正则表达式- 而不是基本正则表达式(BRE)。re_format(7)手册页充分描述了这两种- 垫子


示例

例如,考虑以下命令

$ ls *.json
bower.json  composer.json   package.json

$ find -E . -regex "\./[a-zA-Z0-9]+\.(json)"
./bower.json
./composer.json
./package.json

注意上述答案专门针对BSD find。如果您使用的是GNU find,它将不支持
-E
选项,而是支持
-regextype posix extended
。我可以将上面的例子改写为

$ find . -regextype posix-extended -regex "\./\w+\.(json)"
  • find
    尝试匹配整个文件名。因此,有必要使用
    /

  • 我相信
    find
    不支持
    \w
    \d
    等。所以用字符类替换它们。但是
    find
    也不支持它们,因此需要添加
    -E
    以启用扩展正则表达式

    -E将紧跟-regex和-iregex原色的正则表达式解释为扩展(现代)正则表达式- 而不是基本正则表达式(BRE)。re_format(7)手册页充分描述了这两种- 垫子


示例

例如,考虑以下命令

$ ls *.json
bower.json  composer.json   package.json

$ find -E . -regex "\./[a-zA-Z0-9]+\.(json)"
./bower.json
./composer.json
./package.json

注意上述答案专门针对BSD find。如果您使用的是GNU find,它将不支持
-E
选项,而是支持
-regextype posix extended
。我可以将上面的例子改写为

$ find . -regextype posix-extended -regex "\./\w+\.(json)"
我将使用:

find . -type f \( -name "*.zip" -o -name "*.apk" \) -delete
我将使用:

find . -type f \( -name "*.zip" -o -name "*.apk" \) -delete


在正则表达式中
表示任何字符(类似于glob的
)@Aserre在这种情况下的结果与
\w*\(apk | zip)
添加行尾锚点
查找相同-正则表达式“\w\(apk | zip)$”-删除
效率更高:
^.*\(apk | zip)$
。在正则表达式中使用
\w
意味着名称中带有空格的文件将不会被删除matched@Aserre一开始不需要帽子,因为。*是贪婪的。此外,find的默认正则表达式需要括号转义。在正则表达式中,
表示任何字符(类似于glob的
)@Aserre在这种情况下与
\w*\(apk | zip)
添加行尾锚点
find的结果相同-正则表达式“\w\(apk | zip)$”-删除
效率更高:
^.*\(apk | zip)$
。在正则表达式中使用
\w
意味着名称中带有空格的文件将不会被删除matched@Aserre一开始不需要帽子,因为。*是贪婪的。另外,find的默认正则表达式需要括号转义。没有,可能是因为它不包含
~
?(请参阅更新的问题)find needs括号中使用的默认正则表达式和+escaping as uses BRE。@josemigallas将
~
以及添加到字符类中。更新答案。@nu11p01n73R关于示例,最好使用
*/
,这样子文件夹中的文件也会匹配。@123我安全地忽略了这一点,因为op已经从我的项目根文件夹中写入了.zip和.apk文件。在测试目录中,我有太多的json文件,所以我懒得列出所有的json文件并删除一些;)没有,可能是因为它不包括
~
?(请参阅更新的问题)find needs括号中使用的默认正则表达式和+escaping as uses BRE。@josemigallas将
~
以及添加到字符类中。更新答案。@nu11p01n73R关于示例,最好使用
*/
,这样子文件夹中的文件也会匹配。@123我安全地忽略了这一点,因为op已经从我的项目根文件夹中写入了.zip和.apk文件。在测试目录中,我有太多的json文件,所以我懒得列出所有的json文件并删除一些;)