13

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

任何帮助将非常感激!

编辑:

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

4

5 回答 5

52

这可能对你有帮助

ls --ignore=*.txt

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

于 2012-09-29T04:49:08.257 回答
19

也许这个命令会帮助你

find ./ -maxdepth 1 ! -path "*txt"
于 2012-09-28T05:31:10.347 回答
14
ls|grep -v ".txt"

这有帮助吗?

于 2012-09-28T05:25:03.230 回答
6

ls只是列出了它所呈现的参数。在ls看到之前*.txt被扩展,尝试.a.txt c.txtecho *.txt

要使用sed执行您要求的操作,您可以从其输入中删除模式,例如:

ls | sed '/\.txt$/d'

将删除所有以 . 结尾的行.txt

使用bashzsh您可以让 shell 进行反向扩展,使用 bash 它将是:

ls !(*.txt)

zsh:

ls *~*.txt

请注意,两个 shell 都需要shopt -s extglob使用bashzsh启用扩展 glob选项setopt extendedglob

于 2012-09-28T07:34:21.140 回答
4

一种使用方式find

find . -maxdepth 1 -type f -not -name "*.txt" -printf "%f\n"
于 2012-09-28T05:31:07.790 回答