![从另一个目录 tar 文件而不复制它们](https://linux22.com/image/44075/%E4%BB%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%20tar%20%E6%96%87%E4%BB%B6%E8%80%8C%E4%B8%8D%E5%A4%8D%E5%88%B6%E5%AE%83%E4%BB%AC.png)
对于这里的专家来说这应该很简单。
我有一个Linux帐户,用户磁盘配额只有6GB。有一些数据文件夹包含/opt
大约 3GB 的数据,压缩后可达 1GB。里面有一些符号链接data-folder
。通常,为了进行工作备份,我常常执行以下操作。
cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder
现在我的用户磁盘配额已经消耗了 2.5GB,我只有足够的空间将文件复制到我的家中,但不能tar
再复制到我的家中。
有没有办法在单个命令中压缩并复制文件夹,例如使用管道。
PS 我无法压缩,/opt
因为我只有读取权限/opt
。
答案1
您想在远离需要 tar 文件的位置创建 tar 文件吗?
有很多方法可以做到这一点。
如果要在本地创建(=在同一台机器上):
tar czvf /path/to/destination/newfile.tar.gz ./SOURCEDIR_OR_FILES
您可以在该命令末尾将其他文件或目录添加到 tar 中。
如果要远程创建(即,您想要在远程主机上从包含要去皮的数据的主机上创建 tar 文件):
tar czvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cat > newfile.tar.gz'
后来的版本非常通用。例如,您还可以使用相同的技术“复制”目录+子目录:
将目录+子目录复制到另一个本地目录:
tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )
将目录+子目录复制到另一个远程目录:
tar cvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cd REMOTE_DEST_DIR && tar xf - '
如果您不需要它来显示已压缩(或未压缩)的文件,请删除“v”:这样它会运行得更快,但除非出现错误,否则不会说太多。
我使用“./...”作为源来强制 tar 将其存储为相对路径。在某些情况下,您需要添加额外的路径信息:
例如,要压缩 crontab 文件(包括 /etc 中的文件),您可以执行以下操作:
cd / ; tar czf all_crons.tgz ./etc/*cron* ./var/spool/cron
我故意使用相对路径:某些旧版本的 tar 可能很危险,并使用其原始全局路径提取文件,这意味着您可以这样做:cd /safedir ; tar xvf sometar
并让具有全局名称的文件覆盖其原始路径(位于 /safedir 之外)的文件而不是在它下面!非常危险,但仍然有可能,因为那里有旧的生产服务器。最好始终使用相对路径,即使您使用更新的 tar。
答案2
使用-h
tar 选项。从手册页:
-h, --dereference
don't archive symlinks; archive the files they point to
所以你可以使用tar -zcvfh data-folder.tar.gz /opt/data-folder