bash で `.` と `..` を `.*` に一致させないようにするにはどうすればよいですか

bash で `.` と `..` を `.*` に一致させないようにするにはどうすればよいですか

ディレクトリ内のすべてのドット ファイルを に一致させようとすると、.*厄介な副作用があるようです。すべての (実際の) ファイルとディレクトリに一致するだけでなく、.と にも一致します..

bash-3.2$ mv test/.* dest/
mv: rename test/. to dest/.: Invalid argument
mv: test/.. and dest/.. are identical

これは本当に奇妙に思えます。なぜなら、これらは基本的に「偽の」ディレクトリであり、相対パスを簡単にするためだけに存在するからです。これらはディレクトリの内容の一部ではなく、あるディレクトリの内容を別のディレクトリに移動しようとするときにこれらが一致することは決して望ましくありません。これらが . によって一致することを望むシナリオは思いつきません.*

では、どうすればこれをオフにできるでしょうか? (Z シェルを使用する以外に、常に利用できるとは限らず、私が作成した関数を実行しているユーザーが使用しているシェルではない可能性もあります。)

答え1

bash 変数を使用できますGLOBIGNORE

       グロビニョーレ
              ファイル名のセットを定義するコロンで区切られたパターンのリスト
              パス名展開では無視されます。
              パス名展開パターンは、次のパターンの1つにも一致します。
              GLOBIGNORE の場合、一致リストから削除されます。

そして

       .......................-. ファイル名「.」と「..」は常に
       GLOBIGNORE が設定されていて null でない場合は無視されます。  

つまり、

GLOBIGNORE='*/.:*/..'

すると、ご要望どおり、と はpath/.*一致しなくなります。...

答え2

glob パターンは.[^.]*、2 番目の文字がドットではない、少なくとも 2 文字を含むものと一致します。

ファイル名パターン マッチングのドキュメントは、bash のマニュアル ページまたは次の場所にあります。http://www.gnu.org/software/bash/manual/bash.html#パターンマッチング


ジョナサン・カレンは良い点を指摘しています。かなり単純な拡張パターンを使うことができます

shopt -s extglob
ls -d .!(.|)

関連情報