如何列出文件名超过“ 2015”的一天之前的文件?


11

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

这些是我尝试过的命令:

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

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


find部分对我来说看起来不错,但我在-exec参数方面也遇到了问题。我也无法正常工作。(我试图通过它将所有jpg文件从一个文件夹移动到其父目录-并最终手动完成了...)
Byte Commander


@steeldriver我觉得这真的发生了什么事情错在这里,因为如果有在当前目录中的文件与2015在他们的名字(的方式等明显的缺点:写入命令),我怀疑会有一些类型的输出。因此,您可能想发布有关此问题的答案。
伊利亚·卡根

Answers:


18

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

您的第一个命令是-name 2015。它不起作用,因为它找到名称完全相同的 文件2015,其中没有其他字符。

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

1.未引号的*字符由外壳扩展,然后传递给find

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

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

  • '*2015*'(即find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;
  • "*2015*"(即find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;
  • \*2015\*(即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小时前的文件。因此,昨天的文件不匹配。

请参见为什么查找-mtime +1仅返回早于2天的文件?有关更多信息,请参见steeldriver建议

要查找的文件随时超过24小时前最后一次修改,我建议,而不是规定它作为1440分钟前-mmin +1440

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

一些读者可能想知道为什么我没有报价{}。有人引用{}来提醒人类,这不是支架扩张的一种表达。伯恩式炮弹(如bash的要求{}与里面什么都没有被引用。也许某些非伯恩风格的外壳确实对其进行了特殊处理;这可能就是为什么某些用户引用它的原因。但是也有一个误解,即有时必须引用,{}以便-exec正确处理带有空格的文件名。那是错误的:使用{}'{}'find得到相同的参数,因为外壳在传递给之前会删除引号'{}'find。为了消除这种误解,我不引用{},但这只是样式问题-如果您{}想记录一下shell是如何处理的{,那么}特别好。

我建议您也更改ls命令,或者(如muru所建议)将其替换为find-ls操作。ls -ltrh可能没有按照您的预期做,因为它针对找到的每个文件单独运行,因此指定排序的-tand -r标志无关紧要。

尽管输出的格式与ls -l使用时会有所不同,但使用起来-ls更简单。

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

或者,如果您确定只需要列出文件名(包括它们相对于的路径.),则可以不指定任何操作,从而使用默认-print操作:

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

1
好的彻底的答案!至少对于GNU find,还有newerXY语法,它接受日历参数,例如-newermt 'yesterday'and! -newermt 'yesterday'
steeldriver

你知道吗 ?你是真棒@利雅卡根。
rɑːdʒɑ

谢谢stell driver,从链接知道的那是很好的信息。但是就我而言,因为它是来自应用程序旧文件的应用程序日志,无法修改。再次感谢您
rɑːdʒɑ

2

引用表达式,我建议您也引用括号

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

要么

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

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

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

也许限制使用-type f?如果ls必须使用,建议使用-ls
muru 2015年

1
当然,所有好的建议。我不确定OP想要什么,并且我相信问题的根源在于“ -name”搜索模式周围缺少引号。
黑豹

2

zsh中,可以使用glob限定符(这是zsh的独特功能,在其他shell(如bash)中不可用)。

ls -ltr *2015*(m+1)

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

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

使用find-name 2015仅查找名称完全相同的文件2015-name *2015*2015在当前目录中没有名称包含文件的情况下才起作用,因为外壳程序会在调用*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中没有真正方便的方法来进行此测试。

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.