列出与文件名中给定字符串不匹配的文件


16

我有一个目录,在其中创建了很多文件(大约200个),该文件的名称temp_log.$$带有其他一些我需要检查的重要文件。

如何轻松列出所有文件并temp_log.$$从显示中排除文件?

预期产量

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

我浏览了ls手册页,但在此参考资料中找不到任何内容。如果我错过了任何重要信息,请告诉我。

谢谢


在BASH中,ls --hide='temp_log.$$'应该可以工作。您也可以/也应该使用通配符来扩展它,具体取决于整个术语的哪一部分temp_log.$$
erch

Answers:


25

使用GNU ls(非嵌入式Linux和Cygwin上的版本,有时在其他地方也可以找到),列出目录时可以排除某些文件。

ls -I 'temp_log.*' -lrt

(请注意-Iis 的长格式--ignore='temp_log.*'

使用zsh,可以让shell进行过滤。传递-dls以免上市匹配目录的内容。

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

通过ksh,bash或zsh,您可以使用ksh过滤语法。在zsh中,setopt ksh_glob首先运行。在bash中,shopt -s extglob先运行。

ls -dltr !(temp_log.*)

请不要在GNU ls的示例中使用单引号:ls -I'temp_log。*'-lrt它们是将模式传递给命令而不是让Shell扩展它所必需的。
shargors

在Ubuntu bash v4.3.48上,-Itemp_log.*-I
Yan King Yin

1
@YanKingYin不,在之后可以有空格-I。但是,*需要以一种或另一种方式引用。-I temp_log.*不工作,但-I 'temp_log.*'-I "temp_log.*"-I temp_log.\*,等都是精品。
吉尔斯(Gilles)'所以


3

您可以find为此使用:

find . \! -name 'temp_log*'

这将只打印名称,您可以添加-lsls -l使用时间戳和权限来生成样式输出,或者使用-exec ls {} +想要的用于列,排序等的任何选项将其实际传递给ls。

我写这是假设这只是目录中的文件。如果该目录包含其他目录,则可能要避免递归列出它们

find . \! -name 'temp_log*' -maxdepth 1

如果使用ls,则需要传递-d选项以阻止在目录中列出:-exec ls -d {} +


可能还想-maxdepth 1模仿非递归ls
jw013 2012年

真好 谁拥有更最小的POSIX用户find-maxdepth 应该看这里
通配符

2

我认为您想使用外壳的功能,而不是的功能ls。我使用bash,因此检查了您想要的内容man bash。搜索“ ^ EXPANSION”(首先按“ /”)。摘抄:

扩张

    拆分成单词后,在命令行上执行扩展。执行了七种扩展: 大括号扩展代字号扩展参数和变量扩展命令替换算术扩展单词拆分路径名扩展

   ︙
... <
   片段> ... ︙

路径名扩展

    词的拆分之后,除非-f选项设置,bash的扫描字符每个字*?[。如果出现这些字符之一,则将该单词视为模式,并替换为与该模式匹配的按字母顺序排序的文件名列表。…

我最近开始使用如下命令根据文件的首字母排除文件:

$ ls ./[^t]*

这将匹配所有以字母开头的内容t。如果在方括号之间添加更多字符,则也将排除以这些字母开头的文件。

寻找链接,我很好。请参阅模式匹配。从那里开始,这将适合您的情况:

$ ls -lrt ./!(temp_log.*)

Gilles所述,这要求extglob使用shoptbuildin(shopt -s extglob)启用shell选项。


-1

做就是了

ls -ltr `grep -il patterntosearch  *`

grep在文件中而不是文件名中搜索模式。
evilsoup

-2

由于文件,你希望打印有“temp_log。” 在文件名中,然后使用grep过滤掉:

ls -lrt | grep -v "temp_log."

注意:另一个具有类似答案的帖子可能被否决了,因为用户未在grep应该查找的字符串周围包含引号“”。没有引号,它不会像广告中那样起作用。


您的“注意”并非严格正确。某些字符可能需要加引号,但我认为该特定字符串中没有任何字符。
smokes2345 '18

直到有一个用户或组名为“temp_log”(正则表达式中的点会匹配一个空格或任何以下temp_log这不是一个很好的(普通)的方式来排除。ls结果。
杰夫·夏勒

仅与-F,@ smokes2345; 句点将匹配基本正则表达式中的任何字符。参见:unix.stackexchange.com/q/119905/117549
Jeff Schaller
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.