Если вы заранее знаете, сколько цифр нужно дополнить, это можно сделать довольно просто: объединение функций обработки строк и арифметики оболочки. Чтобы увеличить до 3 цифр, наберите номер от 1000 и удалите начальную 1
.
for current_name in *[0-9]*; do
# Split the name into prefix, digits, suffix
prefix=${current_name%%[0-9]*}; suffix=${current_name#"$prefix"}
# Pad the digits
digits=${suffix%%[!0-9]*}; suffix=${suffix#"$digits"}
digits=$((digits+1000)); digits=${digits#1}
# Rename the file
new_name="$prefix$digits$suffix"
if [ "$new_name" != "$current_name" ]; then
mv -- "$current_name" "$new_name"
fi
done
Вот упрощенный тестовый пример:
trap '
trap - HUP EXIT || exit "$?"
kill -s HUP "$$" || exit "$?" ' HUP INT
kill -HUP $$
$ dash dash-bug
dash-bug: 3: /home2/ahq/dash-bug: Syntax error: EOF in backquote substitution
Изменение длины или содержимого цитируемого кода может либо «исправить» ошибку, либо привести к другим интересным искажениям, когда случайные байты появляются из ниоткуда.
Это было вызвано использованием -после -бесплатной ошибки, которая была исправлена, начиная с dash 0.5.9, но все еще присутствует в dash 0.5.8 из стабильной версии Debian 9.8 (stretch ), Ubuntu 18.04 (бионический )и Ubuntu 18.10 (космический ).
Это коммит , в котором это исправлено:
commit 6c3f73bc536082fec38bd36e6c8a121033c68835
Author: Herbert Xu <herbert@gondor.apana.org.au>
Date: Thu Oct 2 08:26:06 2014 +0800
[EVAL] Fix use-after-free in dotrap/evalstring
The function dotrap calls evalstring using the stored trap string.
If evalstring then unsets that exact trap string then we will end
up using freed memory.
This patch fixes it by making evalstring always duplicate the string
before using it.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Обходной путь -состоит в том, чтобы поместить обработчик прерывания в функцию --, чтобы никакие команды не запускались после сброса прерывания, пытающегося использовать строку действия после того, как оно было освобождено:
sighandler(){
trap - "$sig" EXIT || exit "$?"
kill -s "$sig" "$$" || exit "$?"
}
for sig in HUP INT QUIT ALRM TERM; do
trap "sig=$sig; sighandler" "$sig"
done
kill -s HUP "$$"