我想列出所有不属于今天的日志文件以及仅包含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 中没有真正方便的方法来进行此测试。