Используйте
ffmpeg -i "Movie.mkv" -map 0 -c:v libx265 -x265-params crf=20 -c:a:0 copy -c:a:1 aac "MovieOut.mkv"
Вы всегда можете:
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*
вместо этого в фрагментах кода выше.
Заменить другие подстановочные символы обратной косой чертой + символ. Либо замените символы пробела на обратную косую черту + символ, либо (более надежный )установите 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"
}