GNU Stow -Есть ли способ добавить расширения файлов к файлам.stow -global -ignore или.stow -local -ignore?

Опция #1

Аналогично ответу Кусалананды , но с расширением массива вместо цикла:

настройка

$ touch clip12710-x.png  clip30443-x.png  clip57592-x.png  clip76672-x.png  clip93493-x.png
$ declare -a array=([0]="30443" [1]="76672" [2]="42424")

Обратите внимание, что массив содержит только два элемента, которые должны совпадать; есть имена файлов с клипами, которые , а не присутствуют, и есть номера клипов в array, которые не , а не существуют в качестве имен файлов.

исполнение

$ shopt -s nullglob
$ pfiles=( "${array[@]/#/clip}" )
$ oIFS="$IFS"
$ IFS=
$ pfiles=( ${pfiles[@]/%/-*.png} )
$ IFS="$oIFS"
$ declare -p pfiles
declare -a pfiles=([0]="clip30443-x.png" [1]="clip76672-x.png")

Обратите внимание на тщательное включение двойных -кавычек в первое присваивание и отсутствие двойных -кавычек во второе присваивание. Начальное присваивание преобразует массив чисел "array" в массив "pfiles" частичных имен файлов путем добавления строки clipк каждому элементу. Второе назначение добавляет подстановочный знак -*.pngк каждому элементу массива; отсутствие кавычек в этом назначении позволяет оболочке разделить каждый элемент на$IFS(обычно пробел, табуляцию и новую строку ), но мы временно переопределили IFS, чтобы он был пустым. Затем оболочка также "подставляет" результаты, чего мы и хотим здесь --, чтобы расширить имена "clip... *-png" в любые совпадающие имена файлов. При установленном параметре оболочки nullglobлюбые не соответствующие -подстановочные знаки отбрасываются. Конечным результатом является массив файлов pfiles, соответствующих номерам клипов из исходного массива.


Опция #2

(ab )использовать расширенное подстановочное значение:

shopt -s extglob nullglob
declare -a array=([0]="30443" [1]="76672" [2]="42424")
oIFS="$IFS"
IFS='|'
p="${array[*]}"
IFS="$oIFS"
pfiles=( clip@($p)-*.png )

Это работает путем установки IFS на символ вертикальной черты |, чтобы последующее присвоение pиз array[*]соединяло элементы arrayвертикальной чертой (первый символ $IFS в этой точке ). Каналы — это разделители, которые требуются расширенному синтаксису подстановки bash между параметрами в шаблоне расширенной подстановки.Последняя строка расширяется до массива файлов, соответствующих созданному нами расширенному шаблону глобуса :

.

  • начните сclip
  • содержат один из заданных паттернов (номера клипов ), теперь содержащиеся в переменнойp
  • затем -затем что-нибудь
  • и заканчивается.png

Параметр оболочки nullglobтребуется, если ваш массив клипов не перекрывается ни с какими существующими именами файлов.

0
16.07.2021, 15:27
0 ответов

Теги

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