はじめに
自分がLinuxでfindコマンドを正規表現を使って実行した時にハマった内容について共有したいと思います。
実行環境
実行環境は以下の通りです。(シェルはbash)
$ uname -rs
Linux 3.10.0-1160.31.1.el7.x86_64
$cat /etc/centos-release
CentOS Linux release 7.9.2009(Core)
やりたかったこと
ホームディレクトリ直下のドット(.)で始まるファイル名のファイルだけを、
findコマンドで正規表現のオプションを用いて出力する。
やったこと
以下のコマンドを打てばやりたかったことを実現できると思いました。
$ find ~/ -maxdepth 1 -regextype posix-basic -regex '\..*'
しかしこのコマンドを実行しても、何も表示されませんでした...
(-regextype を posix-awk, posix-egrep, posix-extended にそれぞれ変更してみても同様)
正規表現を使わずにやってみると、ドット始まりのファイルは確かにホームディレクトリ直下に存在しているのです。
$ find ~/ -maxdepth 1 -name '.*'
/home/user1/.bash_logout
/home/user1/.bash_profile
/home/user1/.bashrc
/home/user1/.bash_history
/home/user1/.viminfo
分かったこと
色々と正規表現の書き方を変えて試した結果、このようにすると出力されました!
$ find ~/ -maxdepth 1 -regextype posix-basic -regex '.*/\..*'
/home/user1/.bash_logout
/home/user1/.bash_profile
/home/user1/.bashrc
/home/user1/.bash_history
/home/user1/.viminfo
ほうほう...ということはこうすればどうだ!と思ったら案の定これでもOKでした。
$ find ~/ -maxdepth 1 -regextype posix-basic -regex '/home/user1/\..*'
/home/user1/.bash_logout
/home/user1/.bash_profile
/home/user1/.bashrc
/home/user1/.bash_history
/home/user1/.viminfo
どうやら、findコマンドで正規表現を使う場合は、
ファイル名の正規表現だけではダメで、ファイルのパスで指定してあげる必要があるみたいです。(めんどくさい...)
-name
オプションではファイル名部分だけでよかったのですが、
正規表現ではこれが通用せずかなりハマってしまいました...
まとめ
findで正規表現を使う時はファイル名の正規表現の手前に.*/
を書くのがよい。
それと、わざわざ正規表現を使わないでも-name
オプションでできるならそれで済ませた方が楽。