我正在尝试对目录中的所有文件进行 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
一次调用尽可能少的次数并使用尽可能多的参数。