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