現在のディレクトリと親ディレクトリを除くすべての隠しファイルをグローバルに表示する方法

現在のディレクトリと親ディレクトリを除くすべての隠しファイルをグローバルに表示する方法

すべての隠しファイルとディレクトリを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

コメントで多くのユーザーがデモした次の特殊なケースに注意してください。

  • ...GLOBIGNOREnull 以外の値を持つ限り、常に無視されます。GLOBIGNORE=":" ; echo .*たとえば、上記の例は読みやすくなりますが、機能します。
  • 非表示を一致させたい場合ディレクトリのみ(すべての隠しファイルではない)したがって、globには末尾のスラッシュがあります。これをecho .*/設定する必要がありますGLOBIGNORE='.:..:./:../'。 globが一致し./../結果に表示されないように明示的に除外する必要があるためです。

おすすめ記事