파일 이름의 셸 확장 (A | B)? 수 있습니까? 이것이 의미하는 바는 예를

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 만 인쇄합니까?



답변

숫자 와 일치 하는 표준 파일 이름 글 로빙 패턴 은 [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}

답변

사용할 구문은 및로 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) 파일을.


답변

예, 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