문자열 변수를 명령에 와일드카드 인수로 전달하는 방법

문자열 변수를 명령에 와일드카드 인수로 전달하는 방법

파일 접미사를 기반으로 함께 병합하려는 일부 tif 파일이 있는 디렉터리가 있습니다(파일 이름의 공백에 유의하세요).

File1 P1.tif
File1 P2.tif
File1 P3.tif
File2 P1.tif
File2 P2.tif

그러면 병합된 tif가 생성됩니다.

File1.tif
File2.tif

나는 가지고있다

for i in *\ P1.tif; do
    match=${i/\ P1/\ P*}
    out=${i/\ P1/}
    echo "processing $match"
    tiffcp "$match" "$out"
done

$match포함될 예정 입니다 File1 P*.tif. 그러나 tiffcp는 첫 번째 인수를 문자열로 처리하고 일치하는 파일을 찾을 수 없습니다. 파일 이름의 공백을 인용하지 않으면 일치하는 파일이 생성되지 않습니다.$outFile1.tif$match

따라서 질문은 다음과 같습니다. 와일드카드 문자열을 명령에 대한 인수로 어떻게 전달합니까?

답변1

매개변수 확장 중에 와일드카드를 수행하려면(명령을 호출하기 전에 쉘에 의해 수행되며 명령은 패턴이 아닌 결과 파일을 확인함) 매개변수 확장을 제외하고 그대로 둘 수 있습니다. 따옴표.

따옴표가 없는 인수 확장은 단어 분할 및 와일드카드(때때로 개념적 분할+글로브 연산자라고도 함)를 의미합니다. 여기서는 와일드카드 부분만 필요하므로 분할 부분을 비활성화해야 합니다( $IFS특수 변수에 null 값을 할당하여).

IFS= # disable splitting
for i in ./*\ P1.tif; do
    match=${i/\ P1/\ P*}
    out=${i/\ P1/}
    echo "processing $match"
    tiffcp $match "$out" # split+glob on $match
done

파일 이름의 앞 부분에는 와일드카드 문자가 포함되지 않은 것으로 가정됩니다. 또는 다음을 수행할 수 있습니다.

for i in ./*\ P1.tif; do
    prefix=${i%\ P1.tif}
    out=$prefix.tif
    echo "processing $prefix"
    tiffcp "$prefix P"*.tif "$out"
done

이렇게 하면 그것만이 *glob 연산자로 간주되며, 코드 역시 표준 sh 구문만을 사용한다는 장점이 있습니다.

전역 확장은 어휘적으로 정렬되므로 P10이 P2 앞에 옵니다. 숫자 정렬에는 zsh해당 numericglobsort옵션(또는 glob 한정자)을 사용하세요 .n

관련 정보