Подтвердить что ты не робот

Как сделать bash расширять подстановочные знаки в переменных?

Я пытаюсь добиться такого же эффекта, как и набрав

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  

в командной строке, изнутри bash script. У меня есть:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

который при запуске дает непредвиденную ошибку:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory

Каков правильный способ процитировать все это, чтобы mv действительно выполнил требуемое расширение? (Да, есть много файлов, которые соответствуют шаблону в ./images/.)

4b9b3361

Ответ 1

Удаленный ответ был на правильном пути. Небольшая модификация вашей попытки:

shopt -s extglob
MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='@(pdf|eps|jpg|svg)'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

Расширение скобки выполняется до расширения переменной, но переменное расширение выполняется до расширения имени пути. Таким образом, фигурные скобки по-прежнему являются фигурными скобками, когда переменная расширяется в вашем оригинале, но когда переменная вместо этого содержит элементы pathname, они уже были расширены, когда расширение пути будет выполнено.

Ответ 2

Вам нужно будет оценить эту строку, чтобы она работала так:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
eval "mv \"$MYDIR\"/*.$SUFFIXES \"$OTHERDIR/\""

Теперь у этого есть проблемы, в частности, если вы не доверяете $SUFFIXES, он может содержать инъекционную атаку, но для этого простого случая все должно быть в порядке.

Если вы открыты для других решений, вы можете поэкспериментировать с find и xargs.