我想删除 shell 中特定目录中以给定扩展名集结尾的所有文件/bin/sh
。我可以这样/bin/bash
做 :regex
rm path/(*.pdf|*.png)
但这似乎不适用于普通 sh。正常吗?有没有某种正则表达式support
?
答案1
不,这在严格兼容 POSIX 的 shell 中不起作用。这是规范性参考:
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13_03
正如您所看到的,绝对没有正则表达式,甚至没有 {a,b} 大括号表示法。
答案2
如中所述用户3188445的回答这不符合 POSIX 标准。
但是,如果您无论如何都想这样做,则必须使用另一个工具,例如find
:
find dir/ -maxdepth 1 -type f -regex ".*.pdf\|.*.png" -delete
find
搜索 dir dir/
,不是递归 ( -maxdepth 1
),只找到文件 ( -type f
)。正则表达式匹配 .pdf 和 .png 文件并-delete
删除找到的文件。
答案3
要检查 /bin/sh 真正使用的 shell,请调用:
/bin/sh whatshell.sh
并从此页面获取 Whatshell 脚本:
http://www.in-ulm.de/~mascheck/various/whatshell/
打电话给例如wget http://www.in-ulm.de/~mascheck/various/whatshell/whatshell.sh
典型输出:
$ sh whatshell.sh
SVR4 Bourne shell (SunOS 5 variant)
$ bosh whatshell.sh
SVR4 Bourne shell (SunOS 5 schily variant)
$ bash whatshell.sh
bash 3.2.25(1)-release
$ ksh whatshell.sh
ksh88 Version (..-)11/16/88i
$ ksh93 whatshell.sh
ksh93 Version M 1993-12-28 s+
POSIX 不需要 /bin/sh 中的 POSIX shell。如果您想运行 POSIX shell 调用:
PATH=`getconf PATH` export PATH
sh
请注意,如果这导致运行 bash,则该 shell 预计不符合 POSIX 标准。