我正在尝试在 bash 中列出不是.html
或.js
我已经厌倦了以下两种方法,但都不起作用?
ls !(*.html|*.js)
ls | grep -v '\.(html|js)$'
还有另一种方法可以做到这一点。bash 有一个扩展 glob 模式的选项:
shopt -s extglob
ls !(*.html|*.js)
(请注意,这仍然是一个 glob 模式,而不是正则表达式——例如,*
表示“任何字符串”,而不是“前面的零个或多个”)。
如果您的版本ls
支持该-I
标志:
ls -I *.js -I *.html
从手册页:
-I, --ignore=PATTERN
do not list implied entries matching shell PATTERN
否则,使用find
:
find . -maxdepth 1 -type f ! \( -name "*.html" -o -name "*.js" \)
对于格式添加:
-printf "%f\n"
如果文件名需要通过管道传输,您只需要更改printf()
语句:
-printf '%f\0' | xargs -0 ...
extended-regexp
与-E
选项一起使用:
ls | grep -E -v '\.(html|js)$'
该-I
标志可以过滤ls
输出:
ls -I '*.html' -I '*.js'
或者
ls | grep -v -e '\.html' -e '\.js'
从手册页:
-e PATTERN, --regexp=PATTERN
Use PATTERN as the pattern; useful to protect patterns beginning with -.