Удалить файлы с датой имени файла старше 7 дней

Вы можете написать функцию, которая использует bash'sread -e:

commit() {
  local commitlog
  IFS= read -rep '> ' commitlog &&
     git commit -m "$commitlog" "$@"
}

read -eпозволяет вставить буквенный перевод строки, нажав Ctrl+VCtrl+J , но поскольку readчитает только одну строку, все, что находится после первой новой строки, будет отброшено.

Это можно обойти, добавив опцию -d $'\r'к read, но затем я обнаружил, что, по крайней мере, в версиях 5.0.7 и 4.4.19, это портит обработку Enter. затем в подсказке .

В любом случае проще вzsh:

commit() {
  local commitlog=
  vared -ep '> ' commitlog &&
    git commit -m "$commitlog" "$@"
}

Где новую строку можно ввести с помощью Ctrl+VCtrl+J как в bashили с помощью Alt+Enter

Или с общей историей (здесь и без дубликатов):

commit() {
  emulate -L zsh
  setopt sharehistory histignorealldups histsavenodups
  local commitlog=
  fc -ap ~/.zcommit-history 500
  vared -ehp '> ' commitlog || return
  print -rs -- "$commitlog"
  git commit -m "$commitlog" "$@"
}

1
15.04.2021, 17:34
3 ответа

Сzsh:

#! /bin/zsh -
zmodload zsh/datetime || exit

cd /path/to/backups || exit

strftime -s oldest_to_keep archive-%F.zip $(( EPOCHSECONDS - 7 * 24*60*60 ))

rm -f archive-<->-<1-12>-<1-31>.zip(Ne['[[ $REPLY < $oldest_to_keep ]]'])
2
28.04.2021, 22:52

Проверьте команду find. Хотя здесь я использую фактическую дату файла, команда поддерживает регулярные выражения в списке файлов для поиска и должна иметь возможность делать то, что вы хотите.

# Find and delete files in the Daily tree more than four days old
# (rounding error means 4.23:59:59 is four days, so keep between three and five dailies)
find /dbdata/daily -mtime +3 -delete

Редактировать :Хотя это и возможно сделать по имени, это также намного сложнее. Мы должны создать цикл скрипта, который генерирует строку, представляющую сегодняшнюю дату и предыдущие семь дней, в формате find(, например. )хочет, а затем передайте это findс помощью переключателей -not -regex, чтобы он нашел все, кроме файлов, которые вы хотите сохранить.

-2
28.04.2021, 22:52

Наверное, это можно было бы сделать более изящно, но я простой человек. Также этот скрипт будет натыкаться на имена файлов, содержащие новые строки (, с которыми я никогда не сталкивался в своей жизни):

$ cat archive_cleaner.sh
#!  /bin/bash

age="7 days ago"

find. -iname 'archive*zip' | while read name; do
        bname=`basename "$name"`
        bdate=`echo "$bname" | sed 's/archive-//;s/.zip//'`
        agemax=`date -d "$age" +%s`   || exit 1
        agesrc=`date -d "$bdate" +%s` || exit 2
        if [ $agesrc -lt $agemax ]; then
                echo /bin/rm -v "$name"
        fi
done

$ pwd
/tmp/test

$ find. -type f
./1/2/3/archive-2021-04-08.zip
./1/2/3/archive-2021-04-07.zip
./1/2/3/archive-2021-04-10.zip
./1/2/3/archive-2021-04-14.zip
./1/2/3/archive-2021-03-19.zip
./1/2/3/archive-2021-03-18.zip

$ archive_cleaner.sh
/bin/rm -v./1/2/3/archive-2021-04-08.zip
/bin/rm -v./1/2/3/archive-2021-04-07.zip
/bin/rm -v./1/2/3/archive-2021-03-19.zip
/bin/rm -v./1/2/3/archive-2021-03-18.zip

Удалите «echo» в строке 11, чтобы действительно удалить файлы.

1
28.04.2021, 22:52

Теги

Похожие вопросы