私は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"
つまり、現在のディレクトリにあるすべてのファイルのソートされたリストを提供します。ここでは で提供されます*
。