Обычно я предпочитаю собирать и устанавливать свои собственные пакеты, когда мне нужны изменения, так как таким образом у вас нет неучтенных файлов/двоичных файлов в вашей системе (s ).
Обычно для (повторной )сборки пакетов из исходных пакетов src.rpm требуются определенные шаги.
Процесс в основном автоматизирован, и вам не нужно компилировать или применять все исправления вручную.
Из CentOS -Перестроить исходный RPM
The advantage of unpacking the SRPM first and then using rpmbuild -ba to rebuild it from the specfile is that you can modify the specfile (and maybe add some patches or even upgrade the source tarball) to suit your needs. This is a more complex situation than just rebuilding the SRPM, though, and if you are going down this route you should probably read more on the subject, as explained below, but the process goes like this:
cd ~/rpmbuild/SPECS/
rpmbuild -bp mypackage.spec
cd ~/rpmbuild/BUILD/
cp existing_directory existing_directory.orig
cd existing_directory
find the file you wish to change, modify it.
cd ~/rpmbuild/BUILD/
diff -Npru existing_directory.orig existing_directory > name_of_your_patch_file.patch
cp name_of_your_patch_file.patch ~/rpmbuild/SOURCES/
cd ~/rpmbuild/SPECS/
edit the mypackage.spec file to add the definition of name_of_your_patch_file.patch and the application of your_patch_file -- please look in the file to see how that is done.
rpmbuild -ba mypackage.spec
Наконец, чтобы установить пакет с вашими изменениями:
rpm -i mypackage
Согласно комментариям OP, если у вас уже установлен пакет, вы можете использовать следующую команду для обновления до вашей версии:
rpm -Uvh --force mypackage
Вы можете использовать ?
для соответствия любому одиночному символу (, в отличие от *
, который соответствует нулю или более символам ). Так например
ls -ld ABC??????????C
Однако обратите внимание, что оба имени файла вашего примера соответствуют вашим критериям (они отличаются только 12-м символом ).
С помощью zsh
вы можете сделать:
set -o extendedglob # best in ~/.zshrc
ls -ld ABC?(#c10)C*
Где (#cx,y)
похоже на регулярное выражение {x,y}
для указания интервала повторений предыдущего атома (здесь ?
, который соответствует любому одиночному символу ).
Эквивалентом в ksh93 будет:
ls -ld ABC{10}(?)C*
bash
/ sh
не имеют эквивалента, но если предположить, что $IFS
не содержит ?
символов, вы сможете сделать это как:
repeat() {
awk -- '
BEGIN {
for (i = 0; i < ARGV[1]; i++) printf "%s", ARGV[2]
if (ARGV[1]) printf "\n"
}' "$@"
}
ls -ld ABC$(repeat 10 '?')C
Для поиска по положению с помощью ksh93 вы можете использовать его -опережающие операторы:
ls -ld ~(P:(?=.{0}(A))(?=.{1}(B))(?=.{2}(C))(?=.{13}(C))*
Где смещения :0, 1, 2, 13
~(P:...)
:глобусы ksh93 могут использовать множество различных синтаксисов. Здесь используется Perl -как регулярные выражения. (?=...)
- это положительный взгляд -вперед утверждение, как в perl, которое соответствует на месте с нулевой шириной, если то, что внутри совпадает. .{13}(C)
:соответствует C, за которой следуют 13 символов. Поскольку все совпадения (?=...)
имеют нулевую ширину, все они совпадают в начале субъекта ). Мы используем .{13}(C)
вместо .{13}C
, чтобы обойти ошибку в ksh93. С помощью zsh
вы можете сделать то же самое, выполнив соответствие PCRE в квалификаторе glob:
set -o rematchpcre
ls -ld *(e['[[ $REPLY =~ "^(?=.{0}A)(?=.{1}B)(?=.{2}C)(?=.{13}C)" ]]'])
Или сделать
ls -ld *(e['[[ $REPLY[1,3]$REPLY[14] = ABCC ]]'])
Или используйте вспомогательную функцию, например:
offsets() {
local c o
for o c {
[[ $REPLY[o] = $c ]] || return
}
}
ls -ld *(e['offsets 1 A 2 B 3 C 14 C'])