如何在 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_
请注意,这包括所有子目录。有很多方法可以做到这一点,但对于那些已经熟悉 find
和 grep -v
(不包括结果)的人来说很容易记住。
【讨论】:
以上是关于如何在 bash 中找到所有不以给定前缀开头的文件?的主要内容,如果未能解决你的问题,请参考以下文章
set<string>:如何列出不以给定字符串开头并以`/`结尾的字符串?