从 shell 中的通配符搜索中排除字符串

发布于 2024-08-25 19:48:43 字数 386 浏览 5 评论 0原文

我试图从文件搜索中排除某个字符串。

假设我有一个文件列表:file_Michael.txt、file_Thomas.txt、file_Anne.txt。

我希望能够编写类似

ls *<and not Thomas>.txt

给我 file_Michael.txt 和 file_Anne.txt 的内容,但不给我 file_Thomas.txt。

反过来很容易:

ls *Thomas.txt

使用单个字符也很容易:

ls *[^s].txt

但是如何使用字符串呢?

塞巴斯蒂安

I am trying to exclude a certain string from a file search.

Suppose I have a list of files: file_Michael.txt, file_Thomas.txt, file_Anne.txt.

I want to be able and write something like

ls *<and not Thomas>.txt

to give me file_Michael.txt and file_Anne.txt, but not file_Thomas.txt.

The reverse is easy:

ls *Thomas.txt

Doing it with a single character is also easy:

ls *[^s].txt

But how to do it with a string?

Sebastian

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

毁我热情 2024-09-01 19:48:43

您可以使用 find 来执行此操作:

$ find . -name '*.txt' -a ! -name '*Thomas.txt'

You can use find to do this:

$ find . -name '*.txt' -a ! -name '*Thomas.txt'
波浪屿的海角声 2024-09-01 19:48:43

对于 Bash

shopt -s extglob
ls !(*Thomas).txt

,第一行表示“设置扩展通配符”,请参阅 手册了解更多信息。

其他一些方法可能是:

find . -type f \( -iname "*.txt" -a -not -iname "*thomas*" \)

ls *txt |grep -vi "thomas"

With Bash

shopt -s extglob
ls !(*Thomas).txt

where the first line means "set extended globbing", see the manual for more information.

Some other ways could be:

find . -type f \( -iname "*.txt" -a -not -iname "*thomas*" \)

ls *txt |grep -vi "thomas"
软甜啾 2024-09-01 19:48:43

如果要循环通配符,如果有想要排除的内容,只需跳过迭代的其余部分即可。

for file in *.txt; do
    case $file in *Thomas*) continue;; esac
    : ... do stuff with "$file"
done

If you are looping a wildcard, just skip the rest of the iteration if there is something you want to exclude.

for file in *.txt; do
    case $file in *Thomas*) continue;; esac
    : ... do stuff with "$file"
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文