我目前正在创建一个删除超过 7 天的文件的脚本。这是我当前的脚本。
find -type f -mtime +6 -exec rm -rf {} \;
我需要包含一个名称模式,因此它仅删除LOGS
文件名中包含的内容。示例文件:
- 应用程序A.txt
- 应用程序B.txt
- AppA_LOGS.txt
- AppB_LOGS.txt
它只会删除AppA_LOGS.txt
和AppB_LOGS.txt
文件(假设它们已存在 7 天),并且App.txt
即使AppB.txt
它们已超过 7 天,也会保留。
如何将其添加到当前脚本中?谢谢。
答案1
要按名称过滤,请使用-name
谓词,该谓词采用类似于 shell 通配符中使用的通配符模式:
find . -name '*_LOGS.txt' -type f -mtime +6 -exec rm -f {} +
最好先放置该过滤器,因为它通常比基于文件元数据的过滤器便宜(尽管某些find
实现会自动重新排序)。这样,如果文件因其名称不以 结尾而被排除_LOGS.txt
,find
则不需要检索其元数据。
与 shell 通配符一样,*
匹配任何字符序列。请注意,与 shell glob 相反,对于名称以(隐藏文件)开头的文件没有特殊处理.
,因此它们也将被包含在内。对于名称以 . 开头的目录中的文件也是如此.
。
另请注意,rm
可以采用多个文件名作为参数,因此您可以使用+
而不是;
作为-exec
分隔符。这还有一个优点是可以通过退出代码find
报告错误。rm
另请注意,为了便于移植,您需要至少提供一个文件或目录作为参数,以便find
它知道在哪里搜索。当您不告诉它去哪里查找时,某些find
实现默认为(当前工作目录),但其他一些实现则不然。.
如果使用zsh
,你也可以这样做:
rm -f -- **/*_LOGS.txt(D.m+6)
其中.
相当于-type f
, m+6
of ,-mtime +6
并且也D
像一样考虑隐藏文件和隐藏目录中的文件find
。
与某些实现相反find
,它仍然会设法删除名称包含在区域设置中不形成有效字符的字节序列的文件。但是rm
,如果需要删除非常大的文件列表,它可能无法执行(但请参阅内置zargs
函数或zsh/files
模块来rm
解决该问题)。