나는 bash를 사용하여 OSX에서 이 작업을 수행하고 있지만 분명히 모든 bash 규칙이 사용되는 것은 아니므로 귀하의 제안이 나에게 도움이 되기를 바랍니다 :)
다음 파일이 있습니다
fun bar1.txt
Foo bar2.tXT
(대문자 XT입니다)fun fun.txt
내 목적은 정렬된 방식으로 파일 목록을 반복하는 것입니까?
그것은 다음과 같습니다:
for i in (my-sorted-file-list); do
echo $i
done
이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 감사합니다
답변1
매우 간단합니다:
for i in *; do
echo "<$i>"
done
이는 bash의 파일 와일드카드를 사용합니다. bash는 이미 경로 이름 확장을 정렬하므로 정렬이 필요하지 않습니다.
에서 man bash
:
Pathname Expansion
After word splitting, unless the -f option has been set, bash scans each word for
the characters *, ?, and [. If one of these characters appears, then the word is
regarded as a pattern, and replaced with an alphabetically sorted list of file
names matching the pattern.
결과의 예:
$ touch 'fun bar1.txt' 'Foo bar2.tXT' 'fun fun.txt'
$ for i in *; do echo "<$i>"; done
<Foo bar2.tXT>
<fun bar1.txt>
<fun fun.txt>
정렬 순서는 유틸리티 LC_COLLATE
와 마찬가지로 다릅니다. sort
대소문자를 구분하여 정렬하려면 를 사용하십시오 LC_COLLATE=en_US.utf8
. 대소문자를 구분하여 정렬하려면 를 사용하십시오 LC_COLLATE=C
.
반품 man bash
:
LC_COLLATE
This variable determines the collation order used when sorting the results
of pathname expansion, and determines the behavior of range expressions,
equivalence classes, and collating sequences within pathname expansion and
pattern matching.
답변2
기억해야 할 한 가지:
for i in *.{txt,py,c}; do ...
먼저 *.{txt,py,c}
로 확장합니다 *.txt *.py *.c
.
*.txt
정렬되어 있어도 *.{txt,py,c}
정렬되지 않습니다. 이는 또한 .py
파일이 없으면 리터럴 문자열을 반복하게 된다는 것을 의미합니다 *.py
.
정렬된 전역 목록을 원할 경우 중괄호 확장 대신 대체 와일드카드를 사용해야 합니다. 그리고 bash
:
shopt -s extglob
for i in *.@(txt|py|c); do...
정렬이 대소문자를 구분하는지 여부는 로케일에 따라 다릅니다. 현재 로케일에서 대소문자를 구분하지 않고 정렬하려면 다음 zsh
을 사용하여 새 정렬 순서를 정의하면 됩니다.
ci() REPLY=${(L)REPLY}
for i (*.(txt|py|c))(N.o+ci)) {...}
답변3
개행 문자가 포함되지 않으면 정렬된 목록이 제공됩니다.
_state=$(set +o)
set -f
IFS='
' ; for f in $(set +f; printf %s\\n * |sort) ; do echo "$f" ; done
eval "$_state"
즉, 현재 디렉토리에 있는 모든 파일의 정렬된 목록을 제공합니다. 여기서는 로 제공됩니다 *
.