Следующее простое управление версиями script предназначено для поиска последнего номера версии данного файла, его увеличения, выполнения заданной команды с вновь созданным файлом (например, редактора), а после этого сохраните его до стабильного. Поскольку он прост, он ничего не проверяет, так как script будет изменен по мере необходимости. Например, если результат не будет стабильным, пользователь может опустить последний аргумент.
Однако одна из основных проблем текущей функции заключается в том, как реализовать следующее: если последний раздел после точки имеет две цифры, в том числе до 99; если только 1, затем inc до 9, затем перейдите к предыдущему разделу. Версии могут иметь любое положительное целое число секций.
1.2.3.44 -> 1.2.3.45
1.2.3.9 -> 1.2.4.0
1.2.3 -> 1.2.4
9 -> 10
Оставшаяся проблема заключается в том, что она не дожидается, когда редактор файлов с вкладками будет закрывать файл; цель состоит в том, чтобы обнаружить, когда вкладка закрыта. Кроме того, не могли бы вы объяснить, как лучше всего убедиться, что мои имена переменных не перезаписывают существующие?
Вы также можете предложить другие улучшения.
#!/bin/bash
#Tested on bash 4.1.5
#All arguments in order: "folder with file" "file pattern" cmd [stable name]
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"
cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
sort -Vu | \
tail -n 1)
last_version_file=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
grep $last_version | \
tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(echo $last_version | \
gawk -F"." '{$NF+=1}{print $0RT}' OFS="." ORS="") #increments last section indefinitely
new_version_file=$(echo "$last_version_file" | \
sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" & \
wait #works with gedit but not with wine tabbed editor
[[ "$stable" ]] && \
cp "$new_version_file" "$stable" #True if the length of string is non-zero.
Обновление: Следующее работает на моем компьютере, я обновлю его, если будут найдены улучшения или решения нерешенных проблем:
#!/bin/bash
inc()
{
shopt -s extglob
num=${last_version//./}
let num++
re=${last_version//./)(}
re=${re//[0-9]/.}')'
re=${re#*)}
count=${last_version//[0-9]/}
count=$(wc -c<<<$count)
out=''
for ((i=count-1;i>0;i--)) ; do
out='.\\'$i$out
done
sed -r s/$re$/$out/ <<<$num
}
folder="$1"
file_pattern="$2"
cmd="$3"
stable="$4"
cd "$folder"
last_version=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
sed -nr 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*/\1/p' | \
sort -Vu | \
tail -n 1) #--almost-all do not list implied . and ..
last_version_file=$(ls --format=single-column --almost-all | \
grep "$file_pattern" | \
grep $last_version | \
tail -n 1) #tail -n 1 is only needed to get 1 line if there are backup files with the same version number
new_version=$(inc)
new_version_file=$(echo "$last_version_file" | \
sed -r "s/$last_version/$new_version/")
cp "$last_version_file" "$new_version_file"
"$cmd" "$new_version_file" && \
wait #works with gedit but not tabbed wine editor
[[ "$stable" ]] && \
cp "$new_version_file" "$stable" #True if the length of string is non-zero.
Я ценю разнообразие предлагаемых решений, поскольку они помогают получить перспективу и провести сравнение.