Bash에서 와일드 카드 확장은 순서대로 보장됩니까?


53

Bash에서 와일드 카드 확장이 알파벳 순서로 보장됩니까? 대용량 파일을 10Mb 조각으로 분할하여 Mercurial 저장소에서 허용 할 수 있도록해야합니다.

그래서 사용할 수 있다고 생각했습니다.

split -b 10485760 Big.file BigFilePiece.

그리고 대신에 :

cat BigFile | bigFileProcessor

나는 할 수있을 것이다:

cat BigFilePiece.* | bigFileProcessor

그 자리에.

그러나 별표 (일명 와일드 카드, aka *) 의 확장 이 항상 알파벳 순서로 정렬되어 .aa이전에 .ab타임 스탬프 순서 또는 이와 유사한 것이 아니라는 것을 보장 할 수있는 곳을 찾을 수 없었습니다 .

또한 내 계획에 결함이 있습니까? cat파일을 함께 묶는 데 드는 성능 비용은 얼마나 됩니까?


4
확실히 잘못된 접근 방식을 취하고 있습니다. 관리자가 저장소에있는 파일 크기를 제한 한 경우 그와 대화해야합니다. 확장에 대해 이야기-나는 항상 확장이 영숫자임을 알았습니다.
Mircea Vutcovici

1
sort추가 주문 조작이 필요한 경우 언제든지 파이프를 통과 할 수 있습니다 .
워너

2
Mercurial은 보유한 RAM의 크기에 따라 모든 크기의 파일을 관리 할 수 ​​있습니다. Mercurial은 파일을 메모리에 저장할 수 있다고 가정하므로 큰 파일을 추가하면 경고가 표시됩니다. 병합을 위해 Mercurial은 두 개의 파일을 메모리에 보유해야합니다. 따라서 RAM이 적은 시스템에서는 파일을 체크 아웃하는 데 문제가있을 수 있습니다. 난 그냥 그것을 테스트하고, hg commitA의 NMB 파일에 대한 요구 3 * NMB의 RAM과 hg update에 대해 필요 2 * NRAM의 메가바이트 이것은 Linux에서 Mercurial 1.5와 함께 제공됩니다.
Martin Geisler

답변:


67

그렇습니다. globbing 확장은 알파벳순입니다.

Bash man페이지에서 :

경로명 확장

하지 않는 단어 분할 후 -f옵션이 설정되어, 배쉬는 문자에 대한 각 단어를 검색 *, ?[. 이러한 문자 중 하나가 나타나면 단어는 패턴으로 간주되며 패턴과 일치하는 알파벳순으로 정렬 된 파일 이름 목록으로 대체됩니다.


@Dennis Williamson, 사용자가 다른 언어 세트를 사용하더라도 이것이 사실인지 아는 아이디어가 있습니까?
Zoredache

5
@Zoredache : 실제로 POSIX에 의해 지정됩니다 : opengroup.org/onlinepubs/007908775/xsh/glob.html "경로 이름은 LC_COLLATE 카테고리의 현재 설정에 의해 정의 된 순서대로 정렬됩니다. XBD 사양 LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "이므로" ls -l [[:lower:]]대신에 해야 할 일 이 ls -l [a-z]있습니다.
Dennis Williamson

순서는 알파벳순이므로 BigFilePiece.10이 BigFilePiece.2보다 우선합니다
Ken

@DennisWilliamson-왜 두 쌍의 대괄호? 하나는 나에게 똑같이 작동하는 것 같습니다.
ArtOfWarfare

2
@ArtOfWarfare : 이것을 시도하십시오 : mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. "z"파일은 ls소문자 단일 문자 파일 이름을 요구하기 때문에 초 단위로만 나열됩니다 . ls외부 대괄호가없는 첫 번째 문자는 ":", "l", "o", "w", "e"및 "r"문자 목록에서 단일 문자 파일 이름을 요청합니다. 두 경우 모두 가장 바깥 쪽 대괄호는 문자와 클래스를 나열하는 대괄호 표현식을 구분합니다. 의 경우 [[:lower:]]내부 대괄호, 콜론 및 단어의 이름은 문자 클래스입니다. ...
Dennis Williamson

4

bash스크립트에 의존 할 수 있도록 문서화 된 동작입니다 . 또한 다른 Bourne 호환 쉘에서도 매우 오래 동안 사실이지만 ... 소문자 접힘 또는 영숫자가 아닌 문자와 관련하여 코너 케이스가있을 수 있습니다.

(결과 목록 bash은 거의 "ASCII-betical"순서로 표시됩니다. 단, 대소 문자는 차이가 없지만 대소 문자가 대문자로 표시되기 전에 소문자가 대조되는 것처럼 소문자와 대문자가 함께 정렬됩니다. -알파벳은 ASCII와 같은 순서로 정렬되어야합니다.

다른 사람들이 지적했듯이 LANG 및 LC_COLLATE와 같은 언어 관련 환경 설정으로 인해 문제가 발생할 수 있습니다. env명령을 사용하여 환경을 지우 -i거나 -u(적절한 사용) 또는 sort강력한 시퀀싱을 위해 결과를 파이프 하는 명령 으로 glob 확장 순서에 따라 명령을 실행하는 것이 가장 안전 할 수 있습니다 .


4
영숫자가 아닌 모든 문자는 정렬 과정에서 무시 됩니다. 따라서 "=", "_", "~"를 사용하여 파일을 강제로 목록을 시작하거나 종료 할 수 없습니다.
Otheus

3

글로브 확장은 알파벳순으로 정렬되지만 쉘의 언어 설정에도 따릅니다.

이식성을 높이려면 스크립트에서 이것을 "C"로 설정하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.