0

我正在尝试在 bash 中列出不是.html.js

我已经厌倦了以下两种方法,但都不起作用?

ls !(*.html|*.js)


ls | grep -v '\.(html|js)$'
4

4 回答 4

2

还有另一种方法可以做到这一点。bash 有一个扩展 glob 模式的选项:

shopt -s extglob
ls !(*.html|*.js)

(请注意,这仍然是一个 glob 模式,而不是正则表达式——例如,*表示“任何字符串”,而不是“前面的零个或多个”)。

于 2012-11-29T01:58:47.310 回答
1

如果您的版本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 ...
于 2012-11-29T01:35:47.273 回答
0

extended-regexp-E选项一起使用:

ls | grep -E -v '\.(html|js)$'
于 2012-11-29T01:34:51.420 回答
0

-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 -.
于 2012-11-29T11:40:52.563 回答