【Linux】ファイル検索のあれこれ【ls/find/grep/xargs】

【Linux】ファイル検索のあれこれ【ls/find/grep/xargs】

はじめに

コジマです。

Linuxでファイル探すときに効率よくファイル探したいですよね。

よく使うんですけど、忘れがちですよね。

  • 探したいディレクトリは分かっている
  • 探したいファイル名だけは分かっている
  • 探したいファイル名の一部は分かっている
  • ディレクトリは分かる。ファイル名覚えてないけど、何が書いてあるのか少しわかる

に分けて紹介しようと思います。

前提

試験環境はCentOS7です。RedHat,Debian,Ubuntuでもできると思います。

hoge_fuga.txtというファイルをホームディレクトリ(~/)に用意しました。
中身はこんな感じです。

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::c30e:715d:5eb9:52fa  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:29:bb:4d  txqueuelen 1000  (Ethernet)
        RX packets 453  bytes 38883 (37.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 329  bytes 85273 (83.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 528  bytes 42480 (41.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 528  bytes 42480 (41.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:65:8d:5c  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfigの実行結果を書き込みました。

探したいディレクトリは分かっている

探したいフォルダは分かっているならまずそのフォルダに移動します。

mv ~

そしたらlsします。

ls -l
-lオプションをつけるとリスト表示して見やすくなるのでお勧めです。

実行結果はこんな感じ

[kenta_kojima@studyserver ~]$ ls -l
合計 4
-rw-rw-r--. 1 kenta_kojima kenta_kojima 1273 12月 28 20:55 hoge_fuga.txt
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 ダウンロード
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 テンプレート
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 デスクトップ
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 ドキュメント
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 ビデオ
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 音楽
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 画像
drwxr-xr-x. 2 kenta_kojima kenta_kojima    6 12月 28 20:41 公開

ファイル名もわかる場合はgrepをつけましょう。

ls -l | grep hoge_fuga
[kenta_kojima@studyserver ~]$ ls -l | grep hoge_fuga
-rw-rw-r--. 1 kenta_kojima kenta_kojima 1273 12月 28 20:55 hoge_fuga.txt

より探しやすくなります。

探したいファイル名だけは分かっている

まず、どのディレクトリより下にあるのは確実か思い出してください。
分からなければルート直下からfindします。(荒っぽいけどね。。)

ここでは本当にどこにあるか分からなくなってルート直下からfindすることになったとします。
以下のコマンドを入力します。

find / -name hoge_fuga.txt
[kenta_kojima@studyserver ~]$ find / -name hoge_fuga.txt
・
・
(色々許可がないよ的なエラーが出る)
・
・
/home/kenta_kojima/hoge_fuga.txt

正式なファイル名が分かる場合は-nameオプションとファイル名を入れることで検索可能です。
このように探すことができます。

探したいファイル名の一部は分かっている

この場合はfindとgrepを使ってあげます。

find / | grep hoge
[kenta_kojima@studyserver ~]$ find / | grep hoge
・
・
(色々許可がないよ的なエラーが出る)
・
・
/home/kenta_kojima/hoge_fuga.txt

ディレクトリは分かる。ファイル名覚えてないけど、何が書いてあるのか少しわかる

これが一番鬼門ですね。

この例ではifconfigの結果を書き込んだという物だと分かっています。
「inet」というワードで上手く引っ張り出したいです。

ホームディレクトリにあるのは分かっています。

こちらはこれを参考にしています。
http://kawatama.net/web/1141

find ./ -print | xargs grep ‘inet’

実行結果はこんな感じ。

[kenta_kojima@studyserver ~]$ find ./ -print | xargs grep 'inet'
(ほかにもいろいろでてくる)
./hoge_fuga.txt:        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
./hoge_fuga.txt:        inet6 fe80::c30e:715d:5eb9:52fa  prefixlen 64  scopeid 0x20<link>
./hoge_fuga.txt:        inet 127.0.0.1  netmask 255.0.0.0
./hoge_fuga.txt:        inet6 ::1  prefixlen 128  scopeid 0x10<host>
./hoge_fuga.txt:        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

xargsは標準入力からコマンドラインを作成して実行します。
このようにパイプを使うことでパイプ前のコマンドの実行結果を引数に取ってgrepを実行します。

つまりは

grep ‘inet’ ./hoge_fuga.txt

が二回目に実行されることになります。

さいごに

ファイル検索はよくしますし、紹介した参考リンクはよく見ていましたので、
ファイルを探すノウハウとしてひとまとめにしておこうと思い書きました。

コマンドまとめておくので、Linux使う方はコピーしてメモ帳にぺとっと貼っておくと
便利かと思います。

*ディレクトリは分かる
ls -l
*ファイル名が分かる
find / -name hoge_fuga.txt
*ファイル名の一部が分かる
find / | grep hoge
*ファイルに何が書いてあるか少しわかる
find ./ -print | xargs grep 'inet'

この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!

以上、コジマでした。


小ネタカテゴリの最新記事