![如何在没有读取权限的情况下备份目录结构忽略文件和目录](https://linux22.com/image/37390/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B2%A1%E6%9C%89%E8%AF%BB%E5%8F%96%E6%9D%83%E9%99%90%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%A4%87%E4%BB%BD%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E5%BF%BD%E7%95%A5%E6%96%87%E4%BB%B6%E5%92%8C%E7%9B%AE%E5%BD%95.png)
有什么想法如何备份其中有一些您无权读取的文件和/或目录的目录结构吗?我想忽略这些,而不会让备份(tar?jar?)崩溃。
答案1
Gnu tar 有一个选项--ignore-failed-read
可以做到这一点。
如果您不使用 GNU tar,则可以生成要备份的文件列表或要排除的文件列表。 GNU find 有一个-readable
谓词来测试您是否具有文件的读取权限。对于 find 的其他版本,要单独使用find
,您需要使用文件权限 ( -perm
) 和所有权 ( -user
, group
) 来近似这一点,这使得处理组、ACL 等变得困难。您可以通过调用来获得精确的测试外部程序或内置 shell test
。下面是一个示例,假设您tar
可以选择-X
读取要排除的以换行符分隔的文件名列表(跳过包含换行符的文件名,以避免解析问题):
find . ! -name '*
*' -exec sh -c 'for x; do [ -r "$x" ] || printf "%s\\n" "$x"; done' _ {} |
tar -cf backup.tar -X - .
答案2
如果路径中没有换行符,则可以执行以下操作:
find . -type f -readable -print | tar cf test.tar -T -
这可能仅限于 GNU find
,tar
并且可能不适用于某些文件系统(NFS、FUSE)。如果有或可能有换行符,则使用-print0
代替-print
forfind
并添加--null
for tar
。