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

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

すべての隠しファイルとディレクトリを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が一致し./../結果に表示されないように明示的に除外する必要があるためです。

答え2

以下の最初のglobには、先行点と非点文字が1つ以上追加されている必要があります。これら2つのglobは、複数のドットを持つファイルを含むすべての可能な隠しファイルと一致しますが、正確にユーザーが必要とする.orは一致しません。..

ls -ld .[!.]* ..?*

答え3

ファイルのみをお探しですか?あなたはそれを使う能力がありますかfind

次のようになります(GNU仮定find):

find . -mindepth 1 -maxdepth 1 -name ".*" -printf "%P\n"

答え4

隠しファイル/フォルダを表示したいのですが...

このbashワイルドカードを使用してください{.[!.]*,..?*}

サンプル

サンプルデータを生成してみることができます。

$ touch ...a  ...aa  ..a  ..aa  .a  .aa  .aaa  a
$ mkdir ...b  ...bb  ..b  ..bb  .b  .bb  .bbb  b

証明する

以下で予想される削除項目を確認できます。

$ diff <(\ls -a) <(\ls -ad {.[!.]*,..?*})
1,3d0
< .
< ..
< a
11d7
< b

プロフェッショナルバージョン

すべての隠し要素を削除するのに便利です。たとえば、次のようになります。

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

# <regenerate sample data here>

$ rm -rf {.[!.]*,..?*}
# No error

関連情報