![是否可以从 .tar 中删除已解压的文件?](https://linux22.com/image/191721/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E4%BB%8E%20.tar%20%E4%B8%AD%E5%88%A0%E9%99%A4%E5%B7%B2%E8%A7%A3%E5%8E%8B%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个.tar
文件占用了大约 70% 的磁盘空间,我需要将其解压到同一磁盘上。该tar
命令是否可以选择删除在此过程中已解压的文件,以便它们不再占用空间?该--delete
选项似乎能够从.tar
存档中删除特定文件,但是有没有办法告诉tar
始终删除刚刚解压的最后一个文件?这样,随着解压文件大小的增加,.tar
大小最终会一直减小到零。
此外,如果该过程被中断,它可以从离开的地方继续,因为只有解压的文件仍然存在于.tar
.
答案1
#! /bin/bash
test ! -e "$1" && echo "Run with a tar archive" && exit
tar --list -f "$1" | tac | while IFS= read -r fname; do
test "${fname: -1}" = '/' && continue # skip directories
tar --extract -f "$1" "$fname" || exit 1 # let's stop in case we can't extract a file
tar --delete -f "$1" "$fname" || exit 2 # just in case
done
test "$?" = "0" && tar xf "$1" # restore directories timestamps
tac
用于反转文件的顺序,以便 tar 在删除文件后不需要重写整个存档 - tar 只需要截断存档。我已经在几个文件上测试了该脚本 - 它工作得很好,尽管对于包含大量小文件的存档来说可能会非常慢。
"${fname: -1}"
提取文件名的最后一个符号 - 如果它是斜杠,则它是一个目录,因此我们跳过它。查看便携式版本的评论。