可能重复: How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?
我已经阅读了man
的ls
页面,我找不到列出所有与文件选择器不匹配的选项。你知道怎么做这个操作吗?
例如:假设我的目录是这样的:
> ls
a.txt b.mkv c.txt d.mp3 e.flv
现在我想做一些能做到以下事情的事情
> ls -[SOME_OPTION] *.txt
b.mkv d.mp3 e.flv
有这样的选择吗?
如果没有,有没有办法将ls
的输出传递给另一个只显示我想要的函数(可能是sed
)?
我不知道该怎么做,但我想它会是这样的:
> ls | sed [SOMETHING]
我真的应该学习如何使用sed
,awk
和grep
,但我一直在坚持理解如何编写正则表达式。我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑。
任何帮助将非常感激!
编辑:
我忘了提到我正在运行Mac OS X,所以这些功能可能与unix / linux shell的其他答案中讨论的功能略有不同(因此我对sed
,awk
和grep
的一些混淆)。
也许这个命令会帮助你
find ./ -maxdepth 1 ! -path "*txt"
这可能会对你有所帮助
ls --ignore=*.txt
它不会在您的目录中显示.txt文件。
ls|grep -v ".txt"
这有帮助吗?
我只列出它所呈现的参数。在我看到它之前,*.txt
扩展到a.txt c.txt
,试试echo *.txt
。
要使用sed执行您所要求的操作,您可以从其输入中删除该模式,例如:
ls | sed '/\.txt$/d'
将删除所有以.txt
结尾的行。
使用bash和zsh你可以让shell执行反向扩展,使用bash它将是:
ls !(*.txt)
zsh的:
ls *~*.txt
请注意,两个shell都需要启用扩展的glob选项,shopt -s extglob
使用bash,setopt extendedglob
使用zsh。
使用find
的一种方法:
find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"