从特定目录中删除一种类型的文件,但不从子目录中删除

从特定目录中删除一种类型的文件,但不从子目录中删除

我目前正在 HP-UX 上工作,并且有一个每天早上运行的 cron 作业,它根据保留策略删除早于特定天数的文件。最近,我在删除文件的路径中添加了一个子目录,并希望对该子目录下的文件有不同的策略。

目前我的命令如下:

find /directory/backup -mtime +1 -name "FileName*.EXT" -exec rm {} \; 

当此命令运行时,它将删除备份目录下的所有文件以及备份子目录内的任何匹配文件。我的意思是备份目录中有另一个名为 backup_db 的目录。

pwd
/directory/backup/backup_db

我想限制仅从备份目录中删除,而不是从子目录中删除。我怎样才能做到这一点?非常感谢任何帮助。

我试过男人 rm但是没有找到任何可以帮助我的东西。

答案1

通过命令行,该find命令将生成一系列单独的rm命令并执行它们。每条rm命令都会删除一个用完整路径名指定的文件。所以这不是rm你需要限制的,而是find.

由于历史原因,执行此操作的语法可能有点棘手。你可以这样做:

find /directory/backup ! -path /directory/backup -prune -mtime +1 -type f -name "FileName*.EXT" -exec rm {}\+

这是限制单个目录的find $DIR ! -path $DIR -prune <desired_conditions> [desired_action]POSIX 兼容方式。find但它仍然会列出该特定目录的子目录名称,除非您添加进一步的条件。

使用-type f将限制find尝试rm为备份目录中的子目录生成命令,这只会创建无用的错误消息:要删除目录,您需要递归rmrmdir,我知道这是您不想做的事情在这种情况下。

-exec如果有很多文件要删除,用加号替换命令规范末尾的分号将提高性能:rm它不会为每个文件生成一个命令,而是生成尽可能少的命令,填充尽可能多的路径名参数rm在命令行长度允许的情况下,将其添加到每个命令上。这大大减少了对新流程的需求fork()

答案2

你的问题不是与,rm而是与find。使用该-maxdepth 0选项将搜索限制为起始目录。

如果-maxdepth您的版本不支持,find您还可以使用 和 排除-path目录-prune

要忽略整个目录树,请使用 -prune 而不是检查树中的每个文件。例如,要跳过目录“src/emacs”及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:

寻找 。 -path ./src/emacs -prune -o -print

相关内容