Решение сawk
:
$ awk -F"_" '{ print $1","$2","$3"_"$4}' list
ADB,AR,2006_07.pdf
ADBL,AR,2010_11.pdf
CBL,AR,2013_14.pdf
CZBIL,AR,2007_08.pdf
BOKL,AR,2015_16.pdf
Использовать массив:
var2=( -name "*.avi" -o -name "*.mkv" )
readarray var1 < <(find "/path/to/dir" \( "${var2[@]}" \) | sort)
См. связанный с этим Как мы можем запустить команду, хранящуюся в переменной?
Чтобы получить все имена по пути /path/to/dir
в виде отсортированного списка вbash
:
shopt -s globstar nullglob dotglob
names=( /path/to/dir/** )
Параметр оболочки globstar
в bash
позволяет использовать глобус **
, который работает аналогично *
, но совпадает с /
в путях (, т. е. он соответствует «рекурсивно» вниз в справочники ). Параметр оболочки nullglob
делает так, что если глобус оболочки не не соответствует какому-либо имени, он полностью удаляется (по умолчанию сохраняется нерасширенный шаблон ). Параметр dotglob
приводит к тому, что скрытые имена файлов сопоставляются по умолчанию.
Результирующее расширение оболочки глобуса упорядочено лексикографически, как и вывод по умолчанию sort
, поэтому нет необходимости передавать имена в sort
.
Чтобы получить имена с суффиксами имен файлов .avi
или .mkv
, используйте
shopt -s globstar nullglob dotglob extglob
names=( /path/to/dir/**/*.@(avi|mkv) )
Здесь я добавил параметр оболочки extglob
, который позволяет использовать расширенный шаблон подстановки. Шаблон @(avi|mkv)
означает «либо avi
, либо mkv
», поэтому полный шаблон будет соответствовать любому имени после /path/to/dir
, оканчивающемуся на .avi
или .mkv
. Полученный массив будет отсортирован.
find
было бы полезно, если вам нужно что-то делать с найденными именами или если вам нужно включить тесты определенных типов файлов. Например, если вам нужно убедиться, что вы сопоставляете только обычные файлы , используйте
find /path/to/dir -type f \( -name '*.avi' -o -name '*.mkv' \)
Учитывая два суффикса имени файла avi
и mkv
в массиве с именем suffix
, тесты -name
могут быть построены как массив:
suffix=( avi mkv )
nametest=( -false ) # assumes GNU find here
for suf in "${suffix[@]}"; do
nametest+=( -o -name ".$suf" )
done
find /path/to/dir -type f \( "${nametest[@]}" \)
Практически никогда не бывает правильным сохранять вывод из find
в переменную, когда вы действительно хотите что-то сделать с найденными именами. Вместо этого используйте -exec
для выполнения действия:
find /path/to/dir -type f \( "${nametest[@]}" \) -exec sh -c '
for pathname do
# do something with "$pathname" here
done' sh {} +
Дополнительную информацию см. в
.