可能重复:
How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?
我已阅读man
的{{1}}页面,但我找不到列出不与文件选择器匹配的所有内容的选项。你知道怎么做这个操作吗?
例如: 让我说我的目录是这样的:
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
,但我一直在理解如何编写正则表达式。我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑。
非常感谢任何帮助!
修改
我忘了提到我正在运行Mac OS X,因此这些功能可能与unix / linux shell的其他答案中讨论的功能略有不同(因此我对grep
,{{ 1}}和sed
)。
答案 0 :(得分:43)
这可能会对你有所帮助
ls --ignore=*.txt
它不会在您的目录中显示.txt文件。
答案 1 :(得分:17)
也许这个命令可以帮到你
find ./ -maxdepth 1 ! -path "*txt"
答案 2 :(得分:11)
ls|grep -v ".txt"
这有帮助吗?
答案 3 :(得分:4)
ls 只列出它所呈现的参数。在 ls 看到它之前,*.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 。
答案 4 :(得分:3)
使用find
的一种方式:
find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"