Archive : Add archive_prune_versions.

This commit is contained in:
Dmitry Voronin 2024-01-03 18:06:05 +03:00
parent 02fe135ed1
commit 8a0eab4b44
2 changed files with 61 additions and 5 deletions

View file

@ -124,17 +124,20 @@ function archive_check() {
# Delete old versions of archives. # Delete old versions of archives.
# All archives by default. # All archives by default.
# Usage: archive_prune [NAME] # Usage: archive_prune [NAMES]
function archive_prune() { function archive_prune() {
local IFS=$'\n' local IFS=$'\n'
local targets=(${@}) local targets=()
for target in ${@}; do
targets+=($(ls ${target}* | grep -E ${_archive_pattern})) || return 2
done
[[ "${targets}" = "" ]] && targets=($(ls | grep -E ${_archive_pattern})) [[ "${targets}" = "" ]] && targets=($(ls | grep -E ${_archive_pattern}))
process() { process() {
local data=($(_archive_parse ${target})) local data=($(_archive_parse ${target}))
local name=${data[0]} local name=${data[0]}
local time=${data[1]} local time=${data[1]}
local copies=($(ls ${name}_*)) local copies=($(ls ${name}* | grep -E ${_archive_pattern}))
# Iterate each copy. # Iterate each copy.
for copy in ${copies[@]}; do for copy in ${copies[@]}; do
@ -150,6 +153,27 @@ function archive_prune() {
_iterate_targets process ${targets[@]} _iterate_targets process ${targets[@]}
} }
# Delete old versions of an archive, keeping specified amount of versions. One version by default.
# Usage: archive_prune_versions <NAME> [VERSIONS]
function archive_prune_versions() {
local IFS=$'\n'
local target=${1}
local versions=${2}
[[ "${versions}" = "" ]] && versions=1
if [[ "${target}" = "" ]]; then
help archive_prune_versions
return 2
fi
local prune=($(ls ${target}* | grep -E ${_archive_pattern} | sort -r | sed -e "1,${versions}d"))
for archive in ${prune[@]}; do
rm -- "${archive}" && echo "Prune: ${archive}"
done
}
# Delete specified or all archive files. # Delete specified or all archive files.
# Usage: archive_rm [FILES] # Usage: archive_rm [FILES]
function archive_rm() { function archive_rm() {
@ -293,7 +317,8 @@ function _archive_name() {
COMPREPLY=( $(compgen -W "$(ls | grep -E ${_archive_pattern})" -- ${cur}) ) COMPREPLY=( $(compgen -W "$(ls | grep -E ${_archive_pattern})" -- ${cur}) )
return 0 return 0
else else
local name="${prev%_*}" local data=($(_archive_parse ${prev}))
local name="${data[0]}"
COMPREPLY=( $(compgen -W "${name}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${name}" -- ${cur}) )
return 0 return 0
fi fi
@ -314,6 +339,34 @@ function _archive_date() {
date +%Y%m%d%H%M date +%Y%m%d%H%M
} }
# Get names of all archives.
function _archive_names() {
local IFS=$'\n'
local archives=($(ls | grep -E ${_archive_pattern}))
local names=()
for archive in ${archives[@]}; do
local data=($(_archive_parse ${archive}))
local name=${data[0]}
names+=(${name})
done
_autocomplete ${names[@]}
}
# Get names of all archives once.
function _archive_names_first() {
local IFS=$'\n'
local archives=($(ls | grep -E ${_archive_pattern}))
local names=()
for archive in ${archives[@]}; do
local data=($(_archive_parse ${archive}))
local name=${data[0]}
names+=(${name})
done
_autocomplete_first ${names[@]}
}
# Check if file is an archive. # Check if file is an archive.
function _is_archive() { function _is_archive() {
local out=$(echo "${*}" | grep -E ${_archive_pattern}) local out=$(echo "${*}" | grep -E ${_archive_pattern})
@ -324,3 +377,5 @@ function _is_archive() {
complete -o filenames -F _archive_grep archive_check unarchive archive_rm complete -o filenames -F _archive_grep archive_check unarchive archive_rm
complete -o filenames -F _archive_grep_fast archive_xz complete -o filenames -F _archive_grep_fast archive_xz
complete -o filenames -F _archive_name archive_name complete -o filenames -F _archive_name archive_name
complete -o filenames -F _archive_names archive_prune
complete -o filenames -F _archive_names_first archive_prune_versions

View file

@ -24,7 +24,8 @@ Command|Description
`archive_mt [DIRS]`|Archive using multiple threads. Uses 50% of free RAM. All directories by default. Supports .archiveignore exclude file. `archive_mt [DIRS]`|Archive using multiple threads. Uses 50% of free RAM. All directories by default. Supports .archiveignore exclude file.
`archive_fast [DIRS]`|Archive directories with fast compression. All directories by default. Supports .archiveignore exclude file. `archive_fast [DIRS]`|Archive directories with fast compression. All directories by default. Supports .archiveignore exclude file.
`archive_check [FILES]`|Check archives integrity. Checks all archives by default. `archive_check [FILES]`|Check archives integrity. Checks all archives by default.
`archive_prune [NAME]`|Delete old versions of archives. All archives by default. `archive_prune [NAMES]`|Delete old versions of archives. All archives by default.
`archive_prune_versions <NAME> [VERSIONS]`|Delete old versions of an archive, keeping specified amount of versions. One version by default.
`archive_rm [FILES]`|Delete specified or all archive files. `archive_rm [FILES]`|Delete specified or all archive files.
`archive_xz [FILES]`|Recompress previously created archive_fast with better compression. `archive_xz [FILES]`|Recompress previously created archive_fast with better compression.
`archive_name [ARCHIVE] [NAME]`|Rename archives. If no name specified, it simplifies archive's name. If no archives specified, apply to all archives. `archive_name [ARCHIVE] [NAME]`|Rename archives. If no name specified, it simplifies archive's name. If no archives specified, apply to all archives.