Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 查找和删除旧文件(不包括某些子目录)_Shell_Unix_Directory - Fatal编程技术网

Shell 查找和删除旧文件(不包括某些子目录)

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

我已经搜索了一段时间,但似乎找不到一个简洁的解决方案。我试图删除旧文件,但排除了一些子目录(通过parm传递)及其子目录

我遇到的问题是,当子目录_名称本身比通知的持续时间(也通过parm传递)早时,find命令将子目录_名称包含在find的列表中。实际上,remove无法删除这些子目录,因为
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 {} + \)