bashが「。」と「..」と「.*」を一致させないようにする方法

bashが「。」と「..」と「.*」を一致させないようにする方法

ディレクトリ内のすべてのドットファイルを一致させようとすると、不快な副作用があるようです。すべての(実際の)ファイルとディレクトリを一致さ.*せることに加えて。 ...

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

これは基本的に相対パスを簡単に作成するための「偽の」ディレクトリなので、本当に奇妙に見えます。これはディレクトリの内容の一部ではなく、あるディレクトリの内容を別のディレクトリに移動しようとしたときに一致したくありません。私は彼らと一緒にしたいことは何も思いません.*

ではどうやって消えますか? (常に利用可能ではなく、私が作成した機能を実行している人が使用するシェルではない可能性があるZシェルを使用することに加えて)

答え1

GLOBIGNOREbash変数を使用できます。

       グロビノ
              ファイル名のセットを定義するコロンで区切られたパターンのリスト
              パス名拡張のため無視されます。ファイル名が同じ場合
              パス名拡張パターンは、次のいずれかのパターンとも一致します。
              GLOBIGNOREが試合リストから削除されました。

そして

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

だから設定すると

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

要求されたように合計がpath/.*一致しません。...

答え2

グローバルパターンは、.[^.]*2番目の文字がドットではなく2文字以上の文字と一致することです。

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


ジョナサン・カレン(Jonathan Cullen)が良い指摘をしました。非常に単純な拡張パターンを使用できます

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

関連情報