カレントディレクトリをlsで表示すると以下。この中からカレントディレクトリと親ディレクトリと通常ファイルを抜き出したい。
$ ls -la total 20 drwxr-xr-x 5 u00 u00 4096 08:24 . drwxr-xr-x 3 u00 u00 4096 08:24 .. drwxr-xr-x 2 u00 u00 4096 08:21 ..test_dir -rw-r--r-- 1 u00 u00 0 08:13 ..test_file drwxr-xr-x 2 u00 u00 4096 08:21 .test_dir -rw-r--r-- 1 u00 u00 0 08:10 .test_file drwxr-xr-x 2 u00 u00 4096 08:21 test_dir -rw-r--r-- 1 u00 u00 0 08:20 test_file
これを満たすマッチングは以下。すなわち、ドットで始まるものの内、ドットの後に何もないもの (カレントディレクトリ) とドットの後にドットが続くもの (親ディレクトリ) を除くという意味。
$ echo ./.!(|.) ./..test_dir ./..test_file ./.test_dir ./.test_file
すなわちこのパターンマッチングを ls や mv などの引数に与えれば、bashがこのパターンをファイル名展開して、展開した結果を対象のプログラムに渡してくれる。
$ ls -la ./.!(|.) -rw-r--r-- 1 u00 u00 0 08:13 ./..test_file -rw-r--r-- 1 u00 u00 0 08:10 ./.test_file ./..test_dir: total 8 drwxr-xr-x 2 u00 u00 4096 08:21 . drwxr-xr-x 5 u00 u00 4096 08:24 .. ./.test_dir: total 8 drwxr-xr-x 2 u00 u00 4096 08:21 . drwxr-xr-x 5 u00 u00 4096 08:24 .. $ mkdir ../tmp0 $ mv ./.!(|.) ../tmp0/ $ ls -la ../tmp0/ total 16 drwxr-xr-x 4 u00 u00 4096 08:36 . drwxr-xr-x 4 u00 u00 4096 08:35 .. drwxr-xr-x 2 u00 u00 4096 08:21 ..test_dir -rw-r--r-- 1 u00 u00 0 08:13 ..test_file drwxr-xr-x 2 u00 u00 4096 08:21 .test_dir -rw-r--r-- 1 u00 u00 0 08:10 .test_file