С помощью zsh
вы можете сделать что-то вроде
# get current date (YYMM) in a variable
crd=$(date "+%y%m")
# use a function to extract the 13 chars that make up the timestamp
dtts() REPLY=${${REPLY%%.*}: -13}
# sort file names by the timestamp in descending order, exclude the ones with the
# same YYMM as the current date and set the remaining file names as arguments
set -- *(.O+dtts^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_)
# remove the first item from the list (i.e. the last one before current month)
shift
# print the remaining file names
print -rl -- "$@"
Здесь используется расширение параметров и квалификаторы глобуса :
он сначала выбирает обычные файлы (.) В порядке убывания ( O
) по метке времени с помощью функции dtts
, затем инвертированной e
] string ^ e _ '[["$ {$ {REPLY %%. *}: -13: 4}" == "$ crd"]]' _
отменяет выбор файлов, если метка времени совпадает с текущим годом и месяц (т.е. если выражение внутри кавычек вернет истину); shift
затем удаляет первый элемент из списка (поскольку имена были отсортированы в порядке убывания, который будет последней меткой времени до текущего месяца)
Заменить print -rl
на rm
, если результат вас устраивает.
Несмотря на все усилия некоторых по сжатию данных на месте , tar
действительно может создать файл f
в какой-либо другой файловой системе (или может передать tarball в другую систему через SSH, если на локальном компьютере действительно не хватает места на диске).
cd A
tar cvzf /path/to/B/archive.tgz a_folder
tar cvz a_filter | ssh somehost '...'