使用ls列出与pattern不匹配的所有文件

时间:2012-09-28 05:21:44

标签: shell command-line sed terminal ls

  

可能重复:
  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] sedawk,但我一直在理解如何编写正则表达式。我清楚地理解正则表达式的概念,但我对使用不同语法的正则表达式感到困惑。

非常感谢任何帮助!

修改

我忘了提到我正在运行Mac OS X,因此这些功能可能与unix / linux shell的其他答案中讨论的功能略有不同(因此我对grep,{{ 1}}和sed)。

5 个答案:

答案 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"