使用ls [duplicate]列出所有与模式不匹配的文件

问题描述 投票:11回答:5

可能重复: How can I use inverse or negative wildcards when pattern matching in a unix/linux shell?

我已经阅读了manls页面,我找不到列出所有与文件选择器不匹配的选项。你知道怎么做这个操作吗?

例如:假设我的目录是这样的:

> 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] 

我真的应该学习如何使用sedawkgrep,但我一直在坚持理解如何编写正则表达式。我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑。

任何帮助将非常感激!

编辑:

我忘了提到我正在运行Mac OS X,所以这些功能可能与unix / linux shell的其他答案中讨论的功能略有不同(因此我对sedawkgrep的一些混淆)。

shell command-line sed terminal ls
5个回答
18
投票

也许这个命令会帮助你

find ./ -maxdepth 1 ! -path "*txt"

44
投票

这可能会对你有所帮助

ls --ignore=*.txt

它不会在您的目录中显示.txt文件。


11
投票
ls|grep -v ".txt"

这有帮助吗?


4
投票

我只列出它所呈现的参数。在我看到它之前,*.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。


3
投票

使用find的一种方法:

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"
© www.soinside.com 2019 - 2024. All rights reserved.