我正在尝试使用非.html
或.js
我已经厌倦了以下两种方法,但都不起作用?
ls !(*.html|*.js)
ls | grep -v '\.(html|js)$'
答案 0 :(得分:2)
还有另一种方法可以做到这一点。 bash有扩展glob模式的选项:
shopt -s extglob
ls !(*.html|*.js)
(注意,这仍然是一个glob模式,不是正则表达式 - 例如,*
表示“任何字符串”,而不是“前面的零或更多” )。
答案 1 :(得分: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 ...
答案 2 :(得分:0)
将extended-regexp
与-E
选项一起使用:
ls | grep -E -v '\.(html|js)$'
答案 3 :(得分: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 -.