파일 이름의 셸 확장 (A | B)?


9

or예를 들어 파일을 읽을 때 셸에서 선택 을 확장 할 수 있습니까?

이것이 의미하는 바는 예를 들어 파일에서 A 또는 B와 일치하는 grep구문을 지원 한다는 것 (A|B)입니다.

마찬가지로 이러한 파일이 있으면

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

범위를 확장함에 따라 cat file{1..5}.txt에서 할 수 bash있습니다. 몇 개의 파일에 대해서만 동등한 방법이 있습니까?

예를 들어 cat file(1|5).txt2 만 인쇄합니까?

답변:


16

숫자 와 일치 하는 표준 파일 이름 글 로빙 패턴 은 [0-9]입니다. 한자리 숫자와 일치합니다.

cat file[0-9].txt

이 중 두 가지만 선택하려면

cat file[25].txt

9보다 큰 숫자의 경우 괄호 확장이 유용합니다 (그러나 글 로빙 패턴과 괄호 확장의 차이점에 대해서는 아래 참고 참조).

cat file{25..60}.txt

다시 말하지만 중괄호 확장은 개별 숫자도 허용합니다.

cat file{12,45,900,xyz}.txt

위의 예에서 중괄호 확장에는 산술 루프가 포함되지 않고 제공된 문자열을 기반으로 이름이 생성됩니다.

에서 bash의와 extglob쉘 옵션 (사용 shopt -s extglob), 다음과 같은 것 또한 일 :

cat file@(12|45|490|foo).txt

@(...)패턴이 포함 된 중 하나와 일치합니다 |-delimited 패턴을.


글 로빙 같은 패턴의 차이 [...]@(...)및 중괄호 확장은 중괄호 확장된다는 점이다 명령 행에서 생성 실제로 현재 디렉토리의 기존 이름과 일치하지 않을 수 있습니다. 파일 이름 globbing 패턴은 이름과 일치하지만 가능한 모든 이름이 존재하지 않으면 쉘은 불평하지 않습니다. 경우 에는 일치하는 이름이 존재하지도 않는, 패턴, 확장되지 않은 일 남아 nullglob쉘 옵션이 설정되어있는 경우에는 패턴이 제거됩니다.

예:

touch file1

ls file[0-9]

여기에는 파일 목록 만 file1표시됩니다.

ls file{0..9}, ls찾는 것에 대해 불평하지 것 file0, file2

다음 예제에서 첫 번째 명령은 주어진 패턴과 일치하는 기존 이름 만 터치 하고 두 번째 행은 아직 존재하지 않는 파일을 만듭니다.

touch file[0-9]

touch file{0..9}

@thecarpy 죄송 합니다만, 예를 들어 일치하는 패턴이 아닙니다 file45.txt. 대괄호 표현식 [...]은 정규 표현식과 동일하게 작동하지만 "not in"이라고 말하는 !대신 사용 됩니다 ^. [...]패턴은 항상 단일 문자와 일치합니다.
Kusalananda

당신이 맞아요! BTW, 저도 {1,2}POSIX를 준수하지 않습니다 ... 오늘 몇 가지 새로운 것을 배웠습니다!
thecarpy

2
예를 들어 전달할 패턴 grep생성, 전달할 URL 생성 등을 사용하는 경우 중괄호 확장이 실제 파일과 일치하지 않아도된다는 사실은 매우 유용 curl할 수 있지만 혼동 될 수도 있습니다. 글로브 작업에 익숙한 사람들에게.
케빈

@ 케빈 정답. 중괄호 확장은 파일 이름 일 필요는 없습니다.
Kusalananda

7

사용할 구문은 및로 file{1,2}평가됩니다 .file1file2

$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

Inian이 아래에서 지적한 것처럼 ... touch file{1..9}이 예제에서는 더 쉬울 것입니다 ...

$ ls
$ touch file{1..9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

다음과 같은 여러 표현식을 사용할 수도 있습니다.

$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z

예, 위의 234 (만듭니다 926) 파일을.


1
file{1,2} 구문은 파일 이름을 mv some_very_long_filename.txt{,.bak}
바꾸는데

6

예, bash쉘 에서 괄호 확장을 사용할 수 있습니다 . 단지 몇 개의 파일에 대해서만 file{1..2}또는file{1,2}

또는 경우에 따라 파일이 없을지 걱정되는 경우 간단한 루프를 수행하십시오.

for file in file{1..4}.txt; do
    [ -f "$file" ] || continue
    echo "$file" # Do other actions on file here
done

또는 파일에 대한 유일한 연결이 파일에 대한 유일한 작업이고 어떤 파일이 어떤 시점에 존재하지 않았는지 확실하지 않은 경우 해당 파일 만 cat오류를 억제하십시오. /dev/null파일을 사용할 수없는 경우 오류를 억제하도록 표준 오류를 재 지정 하십시오.

cat file{1,5}.txt 2>/dev/null

또는 file[15]파일을 찾을 수없는 경우 오류에 대해 불평하지 않는 glob 표현식 을 사용하십시오 .

cat file[15].txt

2
아니, 파일이 없다는 것에 대해 걱정할 필요가 없습니다. 숫자로 번호가 매겨진 2 개의 파일 내용을 보여주고 싶었지만 연속적이지 않으므로 file{1,5}쉼표 구문이 모두 누락되었습니다!
Joe Healey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.