すべての隠しファイルとディレクトリをglobしたいのですが、現在(.
)と親ディレクトリ(..
)はglobしたくありません。
バッシュを使っています。
現在の動作を観察します。
$ ls -a
. .. ...a ...aa ..a ..aa .a .aa .aaa a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
.*
私はこれをしたい
$ echo .*
...a ...aa ..a ..aa .a .aa .aaa
シェルオプションがありますdotglob
$ shopt -s dotglob
なんとか働きます。これで*
、すべてを(隠されているかどうかにかかわらず)globできますが、.
そうではありません。..
$ echo *
...a ...aa ..a ..aa .a .aa .aaa a
しかし、今は隠されたものかどうかは区別できません。.*
まだ.
グローブと..
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
and.*
で拡張しない方法はありますか?.
..
ベストアンサー1
この変数を使用してディレクトリを非GLOBIGNORE
表示にできます。また、非表示のファイルと非表示のファイルが一致するようにオプションが自動的に設定されます。ただし、手動でリセットを解除すると、目的の動作が得られます。.
..
dotglob
*
dotglob
この例を見てください。
$ ls -a
. .. a .a ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a
コメントで多くのユーザーがデモした次の特殊なケースに注意してください。
.
..
GLOBIGNORE
null 以外の値を持つ限り、常に無視されます。GLOBIGNORE=":" ; echo .*
たとえば、上記の例は読みやすくなりますが、機能します。- 非表示を一致させたい場合ディレクトリのみ(すべての隠しファイルではない)したがって、globには末尾のスラッシュがあります。これを
echo .*/
設定する必要がありますGLOBIGNORE='.:..:./:../'
。 globが一致し./
、../
結果に表示されないように明示的に除外する必要があるためです。