2
3

More than 3 years have passed since last update.

Linux-findコマンドで正規表現を使う際には、ファイル名だけでなくパスで書く必要がある

Posted at

はじめに

自分が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オプションでできるならそれで済ませた方が楽。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3