我有一个根目录:/opt/abc/logs/EXPORT
在这个目录中,我还有 17 个其他目录
/opt/abc/logs/EXPORT/1
/opt/abc/logs/EXPORT/2
/opt/abc/logs/EXPORT/etc
/opt/abc/logs/EXPORT/17
这些目录里面是文件(没有其他目录)
我想删除超过 30 天的文件,但不删除最后的目录(1
,,,)2
etc
17
我努力了:
find /opt/abc/logs/EXPORT/*/*.* -mtime +30 -exec rm {} \;
(//.-mtime 之间有一个 *)但我收到“没有这样的文件或目录”
有任何想法吗?
首先请注意,
-mtime +30
选择的文件的年龄向下舍入到整数天数严格大于 30,因此这些文件是 31 天或更早的文件。同样适用于m+30
glob 限定符zsh
。find
如果你想选择在过去 30 天内没有被修改的文件(好吧,在启动并查看时钟之前 30✕24✕60✕60✕1,000,000,000 纳秒),你需要-mtime +29
使用 FreeBSDfind
-mtime +30d
或 GNUfind
! -newermt '30 days ago'
还要注意,默认情况下 shell globs 不包含隐藏文件(名称以 开头的文件
.
),并且 Unix 不是 MSDOS,.
否则(除了对于某些应用程序的隐藏文件,例如ls
和 shell globs)在文件名上没有特殊要求,*.*
匹配名称中至少包含一个 的文件.
就像*x*
匹配名称中至少包含一个 的文件一样x
。还要注意,在 Unix 中,目录是多种文件类型之一。其他类型的文件包括常规文件(可能是您提到文件时想到的那些文件)、符号链接、设备文件、fifos ...
要删除两级以下最近 30 天内未修改的常规文件(无论是否隐藏,无论其名称是否包含),使用包括 GNU 在内的一些实现,您可以执行以下操作:
.
/opt/abc/logs/EXPORT
find
find
从 POSIX 角度来看,可能是:
有了
zsh
,那就只是:如果要删除的是目录类型以外的任何文件,您可以
-type f
用! -type d
或 zsh 的.
glob 限定符替换^/
。