Поиск имени файла Unix по позициям символов в имени файла

Обычно я предпочитаю собирать и устанавливать свои собственные пакеты, когда мне нужны изменения, так как таким образом у вас нет неучтенных файлов/двоичных файлов в вашей системе (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

0
06.12.2019, 16:25
2 ответа

Вы можете использовать ?для соответствия любому одиночному символу (, в отличие от *, который соответствует нулю или более символам ). Так например

ls -ld ABC??????????C

Однако обратите внимание, что оба имени файла вашего примера соответствуют вашим критериям (они отличаются только 12-м символом ).

4
28.01.2020, 02:14

С помощью 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'])
2
28.01.2020, 02:14

Теги

Похожие вопросы