複数人で触ってて、中身がだいぶカオスになっててどこに何があるのかわからないサーバがある。 その整理をする際、特定のファイル(スクリプトファイルやソースコード、証明書など)に関してどこかに退避させたいこともある。 しかし、スクリプトファイルも「拡張子が無いと正常に動作しないわけでないから付けない(拡張子が何も付与されていない)」という人もいるし、公開鍵はまだしも秘密鍵ファイルなんかは拡張子がないので、-nameで拡張子指定してfindコマンドで一気にPATHを取得するといったことができない。

では、1個1個catなどで中身を見ていかなくてはいけないのか…?というとそんな苦行はしなくてもいい。 Linuxにはfileコマンドというものがあり、ファイルの中身がものなのか、だいたいのものは調べることができる(例外もあるけど)。 たとえば、秘密鍵や公開鍵、スクリプトなんかは以下のように表示される。

[root@BS-PUB-CENT7-01 ~]# # 秘密鍵
[root@BS-PUB-CENT7-01 ~]# file .ssh/id_rsa
.ssh/id_rsa: PEM RSA private key
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # 公開鍵
[root@BS-PUB-CENT7-01 ~]# file .ssh/id_rsa.pub
.ssh/id_rsa.pub: OpenSSH RSA public key
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # スクリプト
[root@BS-PUB-CENT7-01 ~]# file ./test.sh
./test.sh: POSIX shell script, ASCII text executable
[root@BS-PUB-CENT7-01 ~]# file ./test.py
./test.py: Python script, UTF-8 Unicode text executable

少し効率が悪いが、findコマンドで全ファイルのPATHを取得しそれらにfileコマンドを実行、中身が目的のもののみを抽出してやればよい。 例えば、秘密鍵or公開鍵のみを取得する場合は、以下のようにする。 (検索するルートディレクトリがある程度決まってるなら、findコマンド実行時に絞ってしまった方がいい)

# 全体から検索
find / -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'

# /root or /homeから検索
find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'

[root@BS-PUB-CENT7-01 ~]# find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $0}'
/root/.ssh/authorized_keys: OpenSSH RSA public key
/root/.ssh/id_rsa: PEM RSA private key
/root/.ssh/id_rsa.pub: OpenSSH RSA public key

これを利用して、例えば鍵ファイルだけをtarで固めてgzipで圧縮するなら、以下のようにしてやればよい。

find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $1}' | xargs -n 1 tar -rf ./test.tar ;gzip ./test.tar
[root@BS-PUB-CENT7-01 ~]# find /{home,root} -type f -exec file {} \; | awk -F':' '$2 ~ /private key/||$2 ~ /public key/{print $1}' | xargs -n 1 tar -rf ./test.tar ;gzip ./test.tar
tar: メンバ名から先頭の `/' を取り除きます
tar: メンバ名から先頭の `/' を取り除きます
tar: メンバ名から先頭の `/' を取り除きます
[root@BS-PUB-CENT7-01 ~]# ls -la ./test.tar.gz
-rw-r--r--. 1 root root 2107  1月 21 08:38 ./test.tar.gz
[root@BS-PUB-CENT7-01 ~]# tar tzvf ./test.tar.gz
-rw------- root/root       405 2017-01-20 07:22 root/.ssh/authorized_keys
-rw------- root/root      1675 2017-01-21 08:10 root/.ssh/id_rsa
-rw-r--r-- root/root       417 2017-01-21 08:10 root/.ssh/id_rsa.pub
[root@BS-PUB-CENT7-01 ~]# ls -al ./test.tar
ls: ./test.tar にアクセスできません: そのようなファイルやディレクトリはありません