Ubuntu 16.04.2 LTS VMWare 云服务器
在根 crontab 中使用 find 命令时,会忽略 -maxdepth 开关。从命令行运行完全相同的命令时,find 命令会观察到 maxdepth 开关,并且该开关有效。
此命令仅存档目录 /var/www/news 的内容,而不会递归到子目录中(期望的行为):
$ (cd /; find var/www/news -maxdepth 1 -print0) | /bin/tar -C / --null -T - -zcvf /mnt/nfs/Backup-Static-Sites/backupfile.tar.gz
此 root crontab 命令将存档目录 /var/www/news 下的所有内容(完全忽略 -maxdepth 1 开关/不良行为)
10 0 * * * (cd /; find var/www/news -maxdepth 1 -print0) | /bin/tar -C / --null -T - -zcvf /mnt/nfs/Backup-Static-Sites/backupfile.tar.gz
有没有办法在从根 crontab 内部执行 find 命令时激活对 maxdepth 开关的遵守?
答案1
您看到的行为与 无关-maxdepth
,这是因为来自命令的文件列表find
包含顶级目录,然后由 递归存档tar
。
当前版本的 GNUtar
有一个--no-recursion
选项可以关闭递归目录遍历。但是,如果您不想存档空的顶级目录,最简单的解决方案可能是通过在命令中添加-type f
或! -type d
来从列表中省略目录find
:
10 0 * * * (cd /; find var/www/news -maxdepth 1 ! -type d -print0) | /bin/tar -C / --null -T - -zcvf /mnt/nfs/Backup-Static-Sites/backupfile.tar.gz
答案2
使用目录排除来仅使用 tar 来停止递归,从而消除了 find 的使用。
14 8 * * * /bin/tar -C / -zcvf /mnt/nfs/Backup-Static-Sites/html-News-Snapshot.tar.gz var/www/html-news.domain.tld --exclude "var/www/html-news.domain.tld/dir1" . . "var/www/html-news.domain.tld/dirN"
本线程中提到的其他技术不起作用,即 --no-recursion 和 -type F ! -type d