我目前正在 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
为备份目录中的子目录生成命令,这只会创建无用的错误消息:要删除目录,您需要递归rm
或rmdir
,我知道这是您不想做的事情在这种情况下。
-exec
如果有很多文件要删除,用加号替换命令规范末尾的分号将提高性能:rm
它不会为每个文件生成一个命令,而是生成尽可能少的命令,填充尽可能多的路径名参数rm
在命令行长度允许的情况下,将其添加到每个命令上。这大大减少了对新流程的需求fork()
。
答案2
你的问题不是与,rm
而是与find
。使用该-maxdepth 0
选项将搜索限制为起始目录。
如果-maxdepth
您的版本不支持,find
您还可以使用 和 排除-path
目录-prune
:
要忽略整个目录树,请使用 -prune 而不是检查树中的每个文件。例如,要跳过目录“src/emacs”及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:
寻找 。 -path ./src/emacs -prune -o -print