我正在尝试压缩整个目录树,只留下一个 .tar.bz2 文件,而不是我用 find 找到的每个目录。目的是创建一个 cronjob 来每周执行此操作。
我成功用来列出要压缩的目录的命令是:
find rootDirectory/ -mindepth 2 -type d -not -name '*.bz2'
我用来压缩和完成整个工作的一个是:
find rootDirectory/ -mindepth 2 -type d -not -name '*.bz2' -exec tar --remove-files -cjf ./{}.tar.bz2 ./{} \ ;
它的工作正常,但它会为每个压缩目录抛出一个错误,如下所示:
find: ‘rootDirectory/directory2/02-09-2020-183833-700’: No such file or directory
我在 rootDirectory/directory2/02-09-2020-183833-700.tar.bz2 中得到了所需的结果,但我想消除执行时的错误。我究竟做错了什么?。
提前致谢!
答案1
我假设在创建存档后--remove-files
会删除源目录。tar
该find
实用程序不知道该目录已消失,并且仍会尝试进入该目录以查找与其搜索条件匹配的其他内容。
为了避免输入以这种方式创建存档的目录,请--prune
在命令末尾添加find
:
find rootDirectory/ -mindepth 2 -type d ! -name '*.bz2' \
-exec tar --remove-files -cjf {}.tar.bz2 {} \; --prune
主要--prune
指示find
从要调查的路径中删除该搜索路径,以便它不会尝试进入该目录(该目录不再存在)。
让我印象深刻的是,在这种情况下您可能不需要find
,因为您将创建tar
从rootDirectory
.使用循环可以轻松完成:
for dir in rootDirectory/*/*/; do
tar --remove-files -cj -f "${dir%/}.tar.bz2" "$dir"
done
这里唯一的区别是您会错过具有隐藏名称的目录。