Аналогично ответу Кусалананды , но с расширением массива вместо цикла:
$ 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, соответствующих номерам клипов из исходного массива.
(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
требуется, если ваш массив клипов не перекрывается ни с какими существующими именами файлов.