найти команду с переменной в ней

Решение с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
1
14.07.2019, 04:39
2 ответа

Использовать массив:

var2=( -name "*.avi" -o -name "*.mkv" )

readarray var1 < <(find "/path/to/dir" \( "${var2[@]}" \) | sort)

См. связанный с этим Как мы можем запустить команду, хранящуюся в переменной?

2
27.01.2020, 23:30

Чтобы получить все имена по пути /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 {} +

Дополнительную информацию см. в

.
0
27.01.2020, 23:30

Теги

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