2011-01-14 3 views
21

나는 bash는 스크립트 내부에서 명령 줄에서변수에서 bash 확장 와일드 카드를 만드는 방법은 무엇입니까?

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

를 입력하는 것과 같은 효과를 달성하려합니다. 내가 가진 :

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/의 패턴과 일치하는 파일의 많음이있다.)

답변

22

삭제 된 답변이 올바른 위치에 있습니다. 약간의 수정 시도 :

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

변수 확장 전에 중괄호 확장이 수행되지만 경로 이름 확장 전에 가변 확장이 수행됩니다. 따라서 변수가 원본에서 확장 될 때 중괄호는 여전히 중괄호이지만 변수에 경로 이름 요소가 포함되어 있으면 경로 이름 확장이 완료 될 때 이미 확장되어 있습니다.

+3

+1, 깔끔한 트릭,'@()'에 대해 몰랐다. 나는 새로운 것을 배웠다. 맨 페이지에서'?()'패턴,'*()'패턴,'+()'패턴,'@()'패턴 및'!()'패턴이 궁금한 분을 위해서. 'extglob'가 활성화되면 모두 사용할 수 있습니다. – falstro

+0

훌륭해, 고마워! 쉘 스크립트의 인용과 확장은 항상 문제를 야기하는데, 이것은 많은 도움이 될 것입니다. –

+1

@RossDuncan, 나는 http://mywiki.wooledge.org/BashParser를 쉘의 실행 모델과 관련된 순서에 대한 좋은 참조와 그들이 어떤 순서로 시작하는지 제안 할 것이다. –

5

당신은 그것이 작동하기 때문에 같은 순서로 그 라인을 평가 후면해야합니다 :

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

지금,이 문제가 특히, $SUFFIXES을 신뢰하지 않으면 주사 공격이 포함될 수 있지만이 간단한 경우에는 문제가되지 않습니다.

다른 솔루션을 사용할 수 있다면 findxargs으로 실험 할 수 있습니다.

+1

+1 경고. 'eval'은 악합니다. – l0b0

관련 문제