2021年7月18日日曜日

find コマンドでディレクトリを除外して列挙

はじめに

find コマンドでディレクトリを除外して列挙しようと思って調べてみたら

$ find /etc ! -type d

でよさそうなので、本当にいけてるか調べてみました。

まずは対象ディレクトリ配下のファイルやディレクトリの数を確認

対象ディレクトリとして /etc でやってみます。

$ find /etc
/etc
/etc/services
/etc/lsb-release
(以下省略)

普通に find できます。が。。。

$ find /etc > /dev/null
find: ‘/etc/polkit-1/localauthority: Permission denied
find: ‘/etc/ssl/private: Permission denied

というように標準エラー出力を確認すると、一般ユーザーではアクセスできないものがあるようなので以下、sudo つけてやります。

これらがファイルとかディレクトリとかを確認するために ls に渡します。

$ sudo find /etc | xargs sudo ls -lad
drwxr-xr-x 93 root root        4096 Jul 18 09:55 /etc
-rw-------  1 root root           0 Jun  4 06:39 /etc/.pwd.lock
drwxr-xr-x  3 root root        4096 Jun  4 06:40 /etc/NetworkManager
(以下省略)

drwxr-xr-x の先頭の文字でファイルとかディレクトリとか判断できます。 (この場合は d なのディレクトリ)

cut コマンドで先頭の文字だけ切り出します。

$ sudo find /etc | xargs sudo ls -lad | cut -b 1
d
-
d
d
-(以下省略)

ソートをかけて uniq コマンドでカウントします。

$ sudo find /etc | xargs sudo ls -lad | cut -b 1 | sort | uniq -c
    728 -
    213 d
    628 l

/etc 配下にはファイル (-) が 728個、ディレクトリ (d) が 213個、シンボリックリンク (l) が 628個あることがわかりました。

最終的にファイル名やディレクトリ名にスペースが含まれる場合でも対応できるように以下のようにします。(find に -print0、xargs に -0 を付けてます)

$ sudo find /etc -print0 | xargs -0 sudo ls -lad | cut -b 1 | sort | uniq -c
    728 -
    213 d
    628 l

find に ! -type d を付けてディレクトリが除外されているか確認

ディレクトリが除外され、その他 (今回の場合はファイルとシンボリックリンク) が期待通り列挙されているようです。

$ sudo find /etc ! -type d -print0 | xargs -0 sudo ls -lad | cut -b 1 | sort | uniq -c
    728 -
    628 l

念のため、!-type d だけに効くように () を付けます。

$ sudo find /etc \( ! -type d \) -print0 | xargs -0 sudo ls -lad | cut -b 1 | sort | uniq -c
    728 -
    628 l

結論

$ find /etc ! -type d

でディレクトリを除外して列挙できるみたいです。