Вы можете написать функцию, которая использует 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" "$@"
}
С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 ]]'])
Проверьте команду 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
, чтобы он нашел все, кроме файлов, которые вы хотите сохранить.
Наверное, это можно было бы сделать более изящно, но я простой человек. Также этот скрипт будет натыкаться на имена файлов, содержащие новые строки (, с которыми я никогда не сталкивался в своей жизни):
$ 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, чтобы действительно удалить файлы.