나는 파일 이름 목록을 처리한 다음(그림과 같이 glob 확장 사용 for f in *
) 해당 목록의 하위 집합을 파일로 출력하는 bash 스크립트를 작성했습니다. 그런 다음 파일의 내용을 배열로 읽고 문자열을 비교하기 위해 명백한 <
AND 연산자를 사용하여 >
특정 파일 이름에 대한 간단한 이진 검색을 수행했습니다 .
이 스크립트가 Linux, MacOS, MinGW 등과 같은 다양한 환경에서 작동하기를 원한다는 점을 고려하면(비록 이식성이 떨어지는 환경을 사용하지만 [[
) stat
내 질문은 다음과 같습니다.
- 파일 내용을 정렬해야 합니까(
sort
bash 코드 사용 또는 추가), 아니면 glob 확장이 모든 환경에서 항상 정렬됩니까? 조건부 연산자는
sort
확장(또는 그 이후)과 동일한 "순서"를 사용합니까?(어떤 상황에서?) 이후에 확장되거나 반환되지만
sort
조건부 연산자를 사용하는 것은 이전에 발생합니까? 이 문제를 해결하려면 어떤 옵션을 사용해야 합니까?file10.txt
file2.txt
file10.txt
file2.txt
sort
내 파일 이름 중 일부가 유니코드인 경우 고려해야 할 사항이 있나요?
- 특정 버전의 bash를 사용하는 데 문제가 있나요?
LC_COLLATE
위 사항에 영향을 미치 나요 ?
분명히 이진 검색이 예상대로 작동하려면 연산자의 정렬 "방법"과 일치하는 파일 내용이 필요합니다.
답변1
예, 글로벌 확장은 항상 정렬됩니다.
bash에서 (에서 LESS=+/'^ *Pathname Expansion' man bash
)
경로 이름 확장...단어는 패턴으로 처리됩니다.패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다.
이것은 또한POSIX glob에 의해 지정됨:
...경로 이름은 LC_COLLATE 범주의 현재 설정에 정의된 정렬 순서로 정렬됩니다.
참고 1: GLOB_NOSORT
플래그가 설정되지 않은 경우. 이 경우 순서는 지정되지 않습니다.
노트 2: 정렬 순서는 알파벳순(숫자 아님)이며 2 앞에 10이 붙습니다.
답변:
- 파일 내용을 정렬해야 합니까(정렬 또는 추가 bash 코드 사용)...
Globing은 파일 내용과는 아무 관련이 없으며 파일 이름만 관련됩니다. "파일 내용"을 정렬해야 한다면, 그렇습니다. 꽤 많은 코드를 사용해야
합니다 .sort
bash
- ...또는 모든 환경에서 글로벌 확장이 항상 정렬되어 있습니까?
비활성화하지 않는 한 Globing 결과는 GLOB_NOSORT
환경의 정렬 순서(변수)에 정의된 순서대로 정렬됩니다.LC_COLLATE
동일한 정렬 순서를 가지려면 동일한 유효한 데이터 정렬이 있어야 합니다. 둘 다 변수를 설정 LC_COLLATE
하고 locale
동일한 데이터 정렬 세부 정보를 포함하는 설명을 갖습니다.
- 조건부 연산자는 확장(또는 정렬)과 동일한 "정렬"을 사용합니까?
예. 둘 다 같은 방식으로 영향을 받습니다 LC_COLLATE
.
- 확장하거나 정렬하면 file2.txt 다음에 file10.txt가 반환되지만(어떤 경우에?) 조건부 연산자 file10.txt를 사용하면 file2.txt보다 먼저 반환됩니까? 이 문제를 해결하려면 어떤 정렬 옵션을 사용해야 합니까?
10
before의 결과 2
는 "사전순"이며, 이는 bash 매뉴얼 설명에서 "알파벳순"이라고 부르는 것과 동일합니다. 따라서 bash(또는 POSIX 쉘)를 사용하여 정렬하는 경우 이는 모든 경우에 얻게 되는 순서입니다. 아무런 문제가 없으므로 수정할 수 없습니다(텍스트의 경우).
sort
그러나 (셸 외부의 외부 도구)을 사용하기로 선택한 경우 numeric
정렬(-n 옵션)을 요청하면 가 2
입력 됩니다 10
. 또는 텍스트에서 숫자를 추출하여 -lt
-gt
정수 비교를 수행하는 데 사용할 수 있습니다. 쉘(정수 산술 기호).
내 파일 이름 중 일부가 유니코드인 경우 고려해야 할 사항이 있나요?
시간과 UNICODE 버전에 따라 변경됩니다.
익숙하지 않은 언어로 놀라운 결과를 얻을 수도 있습니다. 예를 들어:
간단히 말해서 "놀라울 준비를 하세요"입니다.
특정 버전의 bash를 사용하는 데 문제가 있나요?
글쎄요, bash 2.0 이상의 버전을 사용해야 합니다
respect LC_COLLATE 2.0
LC_COLLATE가 위 항목에 영향을 줍니까?
가변적인 LC_COLLATE
영향모두위에서 언급한.