Можно ли удалить уже распакованные файлы из .tar?

Можно ли удалить уже распакованные файлы из .tar?

У меня есть .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}"извлекает последний символ имени файла - если это слеш, то это каталог, поэтому мы его пропускаем. Проверьте комментарии для портативной версии.

Связанный контент