Подстановка в расширении параметра

Используйте

ffmpeg -i "Movie.mkv" -map 0 -c:v libx265 -x265-params crf=20 -c:a:0 copy -c:a:1 aac "MovieOut.mkv"
3
17.02.2020, 21:36
2 ответа

Вы всегда можете:

IFS=              # don't split
files=(${@/%/*})  # use split+glob upon expansion with split disabled

Однако, если "$@"содержит подстановочные знаки, они будут интерпретироваться как таковые. Кроме того, вы получите нерасширенные шаблоны для каждого из глобусов, у которых нет совпадений.

Вы можете обратиться к тем, у кого есть петля и опция nullglob:

shopt -s nullglob
files=()
for arg do files+=("$arg"*); done

Или вы можете использовать zshвместо bashи использовать:

files=($^argv*(N))

$^arrayвключает опцию rcexpandparamдля одного расширения $array. В оболочке rc(, а также в оболочке fish), $array*, где $arrayсодержит два элемента a, а bрасширяется как a*, b*, так что здесь это похоже наfiles=($argv[1]*(N) $argv[2]*(N)...)($argv[1]такое же, как $1, только более подробное ). (N)сам по себе является квалификатором глобуса, который включает поведение nullglobдля этого глобуса.

В оболочке fishэто будет просто:

set files $argv*

as fishвключаетnullglob-подобное поведение в аргументах для setи расширяет массивы аналогично rc. Но будьте осторожны, синтаксис fishрадикально отличается от bashгораздо больше, чем zsh.

Обратите внимание, что они предназначены для расширения "$1"*, "$2"*... глобусов, как это сделал бы ваш ${@/%/*}. Если вы на самом деле имели в виду "$1"/*, "%2"/*... globs, как предполагают ваши файлы в наборе каталогов, переданных в качестве аргументов , вам понадобятся ${@/%/\/*}, "$arg"/*, $^argv/*(N), $argv*вместо этого в фрагментах кода выше.

1
28.04.2021, 23:23

Заменить другие подстановочные символы обратной косой чертой + символ. Либо замените символы пробела на обратную косую черту + символ, либо (более надежный )установите IFSна пустую строку. Не забудьте сначала экранировать обратную косую черту, чтобы в конечном итоге вы не -экранировали обратную косую черту, полученную в результате предыдущего шага экранирования. Но не экранируйте ничего, если нечего экранировать, потому что обратная косая черта используется только в том случае, если есть подстановочный знак.

Установите параметр nullglob, чтобы получить пустой список, а не нерасширенный шаблон,если совпадения нет. Сделайте это в функции и примите меры, чтобы изменения параметров оболочки и IFSоставались локальными.

Минимально проверено:

function set_patterns {
  typeset restore_shopt=$(shopt -p nullglob)
  shopt -s nullglob
  typeset IFS=
  typeset x
  patterns=()
  for x; do
    if [[ "$x" == *[*?[]* ]]; then
      x="${x//\\/\\\\}"
      x="${x//\*/\\*}"
      x="${x//\?/\\?}"
      x="${x//\[/\\[}"
    fi
    x="${x//%/*}"
    patterns+=($x)
  done
  eval "$restore_shopt"
}
0
28.04.2021, 23:23

Теги

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