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