如何在 bash 中找到所有不以给定前缀开头的文件?

Posted

技术标签:

【中文标题】如何在 bash 中找到所有不以给定前缀开头的文件?【英文标题】:How do I find all files that do not begin with a given prefix in bash? 【发布时间】:2014-02-17 13:58:02 【问题描述】:

我在一个文件夹中有一堆文件:

foo_1 
foo_2
foo_3
bar_1
bar_2
buzz_1
...

我想查找所有以给定前缀开头的文件并将列表保存到文本文件中。以下是具有给定前缀的文件的示例:

find bar_* > Positives.txt

【问题讨论】:

你熟悉grep -v吗? 重复***.com/questions/216995/… @BroSlow 是的,这个问题很相似,但我认为这更容易被发现。我没想过要搜索该问题中的术语。 【参考方案1】:

如果你也在做子目录:

find . ! -name "bar_*"

或者,等价地,

find . -not -name "*bar_*"

【讨论】:

别忘了在 shell 提示符下转义 ! 很想看到一个我们真正需要逃离的情况!,从来没有经历过。 @grebneke ! 与一些字符混合为一个单词时需要转义。 顺便说一句。可以使用-not 代替! @kenorb 很好,所以基本上我们同意单个 ! 在日常脚本中永远不需要转义。【参考方案2】:

这应该可以在任何 shell 中解决问题

ls | grep -v '^prefix'

-v 选项反转 grep 的搜索逻辑,使其过滤掉所有匹配项。 使用 grep 代替 find 您可以使用强大的正则表达式代替有限的 glob 模式。

【讨论】:

Gnu find 为“强大的”正则表达式实现了-regex 测试。 如前所述,它反转了输出逻辑:不是输出匹配的行,而是输出不匹配的行。 啊是的 - 抱歉错过了。 @rici 是的,但在 shell 编程中最好的做法是避免 GNUisms。在我的职业生涯中,它们总是会导致可移植性问题。如果可以的话,我会努力编写符合 POSIX 标准的脚本。【参考方案3】:

您想查找不是bar_* 开头的文件名吗?

递归:

find ! -name 'bar_*' > Negatives.txt

顶层目录:

find -maxdepth 1 ! -name 'bar_*' > Negatives.txt

【讨论】:

但这是递归的。 别忘了在 shell 提示符下转义 ! @zmo - 是的,我知道 man find! 可能需要转义,但我从未遇到过这种情况。当\! 真的有必要时,你有shell 或情况的例子吗? 不管转义,它都作为参数传递。 @BroSlow - 我不明白这意味着什么?你说我们应该逃跑!还是不行?【参考方案4】:

使用扩展的 glob:

shopt -s extglob
ls !(bar_*) > filelist.txt

!(pattern) 匹配任何pattern,因此!(bar_*) 是任何bar_ 开头的文件名。

【讨论】:

【参考方案5】:

使用 bash 和通配符:ls [!bar_]*。需要注意的是:字母的顺序并不重要,所以rab_something.txt 不会被列出。

【讨论】:

由于您使用的是 Bash,您不妨在这里使用扩展的 glob:printf '%s\n' !(bar_*) > Positives.txt。如果您在脚本中使用它,请不要忘记使用 shopt -s extglob 打开扩展 glob。【参考方案6】:

就我而言,我有一个额外的要求,文件必须以 .py 扩展名结尾。所以我使用:

find . -name "*.py" | grep -v prefix_

在您的情况下,仅排除带有prefix_ 的文件:

find . | grep -v prefix_

请注意,这包括所有子目录。有很多方法可以做到这一点,但对于那些已经熟悉 findgrep -v(不包括结果)的人来说很容易记住。

【讨论】:

以上是关于如何在 bash 中找到所有不以给定前缀开头的文件?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:如何匹配不以前缀列表开头的子字符串

set<string>:如何列出不以给定字符串开头并以`/`结尾的字符串?

如何删除所有不以某些字符开头的行?

从 Windows 上的 bash 脚本运行 Openssl - 主题不以“/”开头

删除CSV文件中不以python中的数字开头的所有行

如何从bash中的ispell .mwl文件中提取所有前缀词