如何列出文件名中带有“2015”一天以上的文件?

如何列出文件名中带有“2015”一天以上的文件?

我想列出所有不属于今天的日志文件以及仅包含2015其名称的文件。

这些是我尝试过的命令:

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

两者的输出都为空,但文件仍然存在。这些命令有些问题,我不知道是什么问题。任何帮助都将不胜感激。

答案1

该命令find . -name '*2015*' -mmin +1440 -ls可能会执行您想要的操作。请参阅下文了解详情。

你的第一个命令有-name 2015。它没有工作,因为它发现仅有的文件名称为确切地 2015,其中不包含其他字符。

您的第二条命令find . -name *2015* -mtime +1 -exec ls -ltrh {} \;可能由于以下几个原因而失败:

1.未加引号的*字符会被 shell 扩展,然后传给了find

如果有任何文件直接包含在当前的find ...目录(运行该命令时所在的目录),其名称包含2015(并且不以 开头.),然后是展开*2015*为这些文件名的列表,然后将该列表作为参数传递给find。这不是您想要的——相反,您希望将*2015*其作为参数传递给 find,以便find(而不是 shell)可以找到与其匹配的文件。

要解决这个问题,引用*2015*。有三种常见的方法可以做到这一点:

  • '*2015*'(IE,find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
  • "*2015*"(IE,find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
  • \*2015\*(IE,find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;

建议写它带单引号因为'*2015*'

但在这种情况下,这并不重要。两者都是同样对待,'并且表达方式也不够复杂,无法引用而难以理解。"*\

2.-mtime +1仅选择已修改的文件两个或以上几天前。

作为man find说:

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

假设某个文件在 47 小时前被修改。要计算出有多少个 24 小时周期,需要find进行以下轮次向下: 这是24 小时前。但-mtime +1仅匹配修改时间为严格超过24 小时前。因此昨天的文件不匹配。

为什么 find -mtime +1 只返回超过 2 天的文件?欲了解更多信息,steeldriver 建议

查找文件最后修改时间超过 24 小时前,我建议改为规定为1440分钟前-mmin +1440

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

有些读者可能会想知道为什么我没有引用{}。有些人引用是{}为了提醒人类,这不是表达括号扩展伯恩风格的贝壳(喜欢狂欢require{}中没有任何内容需要引用。也许一些非 Bourne 风格的 shell 确实会对其进行特殊处理;这可能是一些用户引用它的原因。但还有一个误解有时必须引用,{}这样才能-exec正确处理带空格的文件名。这是错误的:使用{}'{}'find获取相同的参数,作为 shell删除引号在转到 之前'{}'find为了反驳这种误解,我没有引用{},但这是一个风格问题——如果你更喜欢{}记录 shell 如何处理{},那也没问题。

我也建议你改变你的ls命令,或者(如muru 建议)将其替换为find-ls动作。ls -ltrh可能没有按照你的意图运行因为它针对找到的每个文件单独运行,因此指定排序的-t和标志是不相关的。-r

尽管输出格式与 略有不同ls -l,但使用-ls更简单、更容易。

find . -name '*2015*' -mmin +1440 -ls

或者,如果您决定实际上只需要列出文件的名称(包括相对于的路径),那么您可以简单地指定不执行任何操作,从而使用.默认操作:-print

find . -name '*2015*' -mmin +1440

答案2

引用这个表达式,我建议你也引用括号

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

或者

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

你不需要将找到的文件传递给 ls

find . -name "*2015*" -mtime +1

答案3

, 您可以使用glob 限定符(这是 zsh 独有的功能,其他 shell(如 bash)中不具备该功能)。

ls -ltr *2015*(m+1)

这仅列出当前目录中的文件;递归遍历目录, 使用

ls -ltr **/*2015*(m+1)

使用find-name 2015仅查找名称完全为 的文件2015-name *2015*仅当当前目录中没有名称包含 的文件时才有效2015,因为 shell在调用*2015*之前会扩展模式find。您需要引用该模式:

find -name '*2015*' -mtime +1 …

请注意,find -mtime +1和 zsh 都会*(m+1)查找以下文件至少 48 小时前,而不是早于今天的文件。加号表示“严格超过”,天数四舍五入。要查找至少 24 小时前的文件,请使用-mtime +0(m+0)

如果你想查找最后修改的文件昨天或之前,你可以find使用-newermt谓词

find -name '*2015*' ! -newermt 'today 0:00' …

在 zsh 中没有真正方便的方法来进行此测试。

相关内容