创建 tar 存档时查找排除套接字类型文件的问题

创建 tar 存档时查找排除套接字类型文件的问题

我正在尝试对目录中的所有文件进行 tar 存档/var。当然,我想排除其中的 Unix 套接字。

所以我尝试一个看起来像这样的命令:

sudo find /var \! -type s -exec tar -rf ~/test/etc.tar {} \;

但这会引发重复的错误消息

tar format cannot archive socket:

当我尝试进行复制而不是 tar 时,我收到类似的错误:

cp: ./var/run/devd.pipe is a socket (not copied).

有谁知道为什么find无法排除套接字类型的文件?例如,它能够排除目录类型的文件。

答案1

您还必须排除目录。如果不排除目录,tar将获取/var(和其他目录)作为参数,并将继续归档这些目录的所有内容(是否有套接字)。由于相同的原因(/var包括) /var/log/messages,它还会添加许多文件的多个副本/var/log

find /var ! -type s ! -type d -exec tar -r -f archive.tar {} +

或者,如果您只想要常规文件和符号链接:

find /var '(' -type f -o -type l ')' -exec tar -r -f archive.tar {} +

我选择在这里使用-exec ... {} +而不是-exec ... {} ';'因为我们可能希望tar一次调用尽可能少的次数并使用尽可能多的参数。

相关内容