綾小路龍之介の素人思考

[Linux] dotfileだけを処理する。

ドットファイルだけを処理したい。もちろん、grepとかでフィルタすることもできるんだけど、bashのファイル名展開のパターンマッチングを使えばいい。これは bash 依存で sh では使えない。

カレントディレクトリを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

リファレンス

  1. Bash Reference Manual
  2. Bash Reference Manual: Pattern Matching
  3. GNU Coreutils

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-03-03T07:35:41+09:00
  2. Modified: 2008-03-03T07:35:41+09:00
  3. Generated: 2018-03-30T23:09:11+09:00