Shell 查找和删除旧文件(不包括某些子目录)
我已经搜索了一段时间,但似乎找不到一个简洁的解决方案。我试图删除旧文件,但排除了一些子目录(通过parm传递)及其子目录 我遇到的问题是,当子目录_名称本身比通知的持续时间(也通过parm传递)早时,find命令将子目录_名称包含在find的列表中。实际上,remove无法删除这些子目录,因为Shell 查找和删除旧文件(不包括某些子目录),shell,unix,directory,Shell,Unix,Directory,我已经搜索了一段时间,但似乎找不到一个简洁的解决方案。我试图删除旧文件,但排除了一些子目录(通过parm传递)及其子目录 我遇到的问题是,当子目录_名称本身比通知的持续时间(也通过parm传递)早时,find命令将子目录_名称包含在find的列表中。实际上,remove无法删除这些子目录,因为rm命令的默认选项是f 以下是脚本生成的find命令: find /directory/ \( -type f -name '*' -o -type d \ -name subdirectory1
rm
命令的默认选项是f
以下是脚本生成的find命令:
find /directory/ \( -type f -name '*' -o -type d \
-name subdirectory1 -prune -o -type d -name directory3 \
-prune -o -type d -name subdirectory2 -prune -o \
-type d -name subdirectory3 -prune \) -mtime +60 \
-exec rm {} \; -print
以下是文件列表(以及find命令带来的子目录)
除此之外--脚本工作正常,不将文件带到(不包括)这3个子目录下:
子目录1
,子目录2
和子目录3
谢谢。以下命令将仅删除超过1天的文件。 您可以如下面的示例所示排除目录,目录test1和test2将被排除
find /path/ -mtime +60 -type d \( -path ./test1 -o -path ./test2 \) -prune -o -type f -print0 | xargs -0 rm -f
尽管使用-print查看将要删除的内容是明智的
find /path/ -mtime +60 -type d \( -path ./test1 -o -path ./test2 \) -prune -o -type f -print
请注意,AND运算符(-a
,如果未指定,则隐含在两个谓词之间)优先于OR运算符(-o
)。所以上面是这样的:
find /directory/ \( -type d -a \(
-name subdirectory1 -o \
-name subdirectory2 -o \
-name subdirectory3 \) -a -prune \) -o \
\( -type f -a -mtime +60 -a -print -a -exec rm -f {} + \)
请注意,每个文件名都与*
模式匹配,因此-name'*'
类似于-true
,没有任何用处
使用+
代替
运行更少的rm
命令(尽可能少,每个命令都传递了几个要删除的文件)
不要在其他人可写的目录上使用上述代码,因为它容易受到攻击,攻击者可以在find
遍历目录并调用rm
让您删除文件系统上的任何文件期间,将一个目录更改为另一个目录的符号链接。通过使用-delete
或-execdir rm-f{}更改-exec部分
,可以减轻此问题代码>如果您的查找支持它们
如果要排除特定的子目录1
而不是名称为子目录1
的任何目录,请参见-path
谓词:find/directory/(.typed-a(-name子目录1-o-name子目录2-o-name子目录3)-a-prune)-o(-typef-a-mtime+60-a-print)@user2487539,-path
是POSIX,但它是POSIX规范(2008)的一个相对较新的补充。不过,它已经在许多find
实现中使用了一段时间。还有一个问题:删除文件时是否可以打印文件的“更改日期”?谢谢@用户2487539,添加一个-exec ls-ld{}\代码>上次修改时间,-exec ls-lcd{}上次节点更改时间的代码>。
find /directory/ -type d \(
-name subdirectory1 -o \
-name subdirectory2 -o \
-name subdirectory3 \) -prune -o \
-type f -mtime +60 -print -exec rm -f {} +
find /directory/ \( -type d -a \(
-name subdirectory1 -o \
-name subdirectory2 -o \
-name subdirectory3 \) -a -prune \) -o \
\( -type f -a -mtime +60 -a -print -a -exec rm -f {} + \)