以前、15 個の実用的な find コマンドの例 (パート I) を確認しました。検索コマンドは、名前に基づいてファイルを検索するだけではありません。
この記事 (パート 2) では、find コマンドの 15 の高度な例について説明します 含む - アクセス、変更、または変更された時間に基づいてファイルを検索する、比較してファイルを検索する、見つかったファイルに対して操作を実行するなど、
ラメッシュ ナタラジャン: あの写真に写っているのが私の可愛い娘です。彼女は、カリフォルニア ロング ビーチ水族館でアシカを見つけてとても喜んでいました。
アクセス/変更/変更時間に基づいてファイルを検索
次の 3 つのファイル時間属性に基づいてファイルを検索できます。
<オール>
次の例では、min オプションの違いは 時間オプション は引数です。
- 最小引数 引数を 分 として扱います .たとえば、min 60 =60 分 (1 時間) です。
- 時間引数 引数を 24 時間 として扱います .たとえば、時間 2 =2*24 時間 (2 日)。
- 24 時間の計算では端数を無視するため、25 時間は 24 時間、47 時間も 24 時間と見なされ、48 時間のみが 48 時間と見なされます。より明確にするには、find コマンドの -atime セクションを参照してください マニュアルページ
例 1:過去 1 時間以内にコンテンツが更新されたファイルを検索する
コンテンツの変更時間に基づいてファイルを検索するには、オプション -mmin と -mtime を使用します。以下は、man ページの mmin と mtime の定義です。
- -mmin n ファイルのデータが最後に変更されたのは n 分 です 前
- -mtime n ファイルのデータが最後に変更された n*24 時間 前
次の例では、現在のディレクトリとサブディレクトリ内にある、過去 1 時間 (60 分) 以内にコンテンツが更新されたファイルを検索します
# find . -mmin -60
同様に、次の例では、過去 24 時間 (1 日) 以内に更新されたすべてのファイル (ルート ファイル システム / の下) を検索します。
# find / -mtime -1
例 2:1 時間前にアクセスされたファイルを検索する
ファイル アクセス時間に基づいてファイルを検索するには、オプション -amin と -atime を使用します。以下は、find man ページの amin と atime の定義です。
- -amin n ファイルが最後にアクセスされた n 分 前
- -atime n ファイルが最後にアクセスされた n*24 時間 前
次の例では、現在のディレクトリとサブディレクトリ内で、過去 1 時間 (60 分) 以内にアクセスされたファイルを検索します
# find -amin -60
同様に、次の例では、過去 24 時間 (1 日) 以内にアクセスされたすべてのファイル (ルート ファイル システム / の下) を検索します。
# find / -atime -1
例 3:ちょうど 1 時間前に変更されたファイルを検索する
ファイル i ノードの変更時間に基づいてファイルを検索するには、オプション -cmin と -ctime を使用します。以下は、find man ページの cmin と ctime の定義です。
- -cmin n ファイルのステータスが最後に変更されたのは n 分 前
- -ctime n ファイルのステータスが最後に変更された n*24 時間 前
次の例では、現在のディレクトリとサブディレクトリ内で、過去 1 時間 (60 分) 以内に変更されたファイルを検索します
# find . -cmin -60
同様に、次の例では、過去 24 時間 (1 日) 以内に変更されたすべてのファイル (ルート ファイル システム / の下) を検索します。
# find / -ctime -1
例 4:検索出力をファイルのみに制限する。 (find コマンドの結果としてファイルのみを表示)
ディレクトリ内のファイルがアクセスされるとディレクトリがアクセスされるため、上記の find コマンドはディレクトリも表示します。ただし、ファイルのみを表示したい場合は、find コマンドで -type f を
と指定します。
次の検索コマンド 過去 30 分間にアクセスされたファイルを表示します。
# find /etc/sysconfig -amin -30 . ./console ./network-scripts ./i18n ./rhn ./rhn/clientCaps.d ./networking ./networking/profiles ./networking/profiles/default ./networking/profiles/default/resolv.conf ./networking/profiles/default/hosts ./networking/devices ./apm-scripts [Note: The above output contains both files and directories] # find /etc/sysconfig -amin -30 -type f ./i18n ./networking/profiles/default/resolv.conf ./networking/profiles/default/hosts [Note: The above output contains only files]
例 5:非表示にされていないファイルのみに検索を制限する。 (検索結果に隠しファイルを表示しない)
非表示のファイルを検索出力に表示したくない場合は、次の正規表現を使用できます。
以下の検索は、過去 15 分間に変更されたファイルを表示します。また、非表示にされていないファイルのみが一覧表示されます。つまり、で始まる隠しファイル。 (ピリオド) は検索出力に表示されません。
# find . -mmin -15 \( ! -regex ".*/\..*" \)
検索コマンドを使用してファイルを比較検索する
人間の心は、「test」というファイルを編集した後に、自分が編集したファイルを探したいなど、参照することで物事をよりよく覚えることができます。次のように、他のファイルの変更を参照して、ファイルを見つけることができます。
例 6:特定の FILE の変更後に変更されたファイルを検索する
Syntax: find -newer FILE
次の例は、/etc/passwd ファイルが変更された後に変更されたすべてのファイルを表示します。これは、新しいユーザーを追加した後に行ったすべてのアクティビティを追跡する場合に役立ちます。
# find -newer /etc/passwd
例 7:特定の FILE の変更後にアクセスされるファイルを検索する
Syntax: find -anewer FILE
次の例は、/etc/hosts の変更後にアクセスされるすべてのファイルを表示します。 /etc/hosts にエントリを追加したことを覚えていて、それ以降にアクセスしたすべてのファイルを確認したい場合は、次のコマンドを使用してください。
# find -anewer /etc/hosts
例 8:特定の FILE の変更後にステータスが変更されたファイルを検索します。
Syntax: find -cnewer FILE
次の例は、/etc/fstab の変更後にステータスが変更されたすべてのファイルを表示します。 /etc/fstab にマウント ポイントを追加したことを覚えていて、それ以降にステータスが変更されたすべてのファイルを知りたい場合は、次のコマンドを使用してください。
find -cnewer /etc/fstab
検索コマンドで見つかったファイルに対して任意の操作を実行
find コマンドを使用してファイルを検索するさまざまな方法を見てきました。 この記事と以前の記事で。さまざまな方法でファイルを見つけることに慣れていない場合は、パート 1 を読むことを強くお勧めします。
このセクションでは、find コマンドとは異なるファイルの操作方法について説明します。つまり、find コマンドの出力によって返されるファイルを操作する方法です。
find コマンドで見つかったファイルに対して任意の操作を指定できます。
find <CONDITION to Find files> -exec <OPERATION> \;
OPERATION は次のようなものです:
- rm コマンド find コマンドで見つかったファイルを削除します。
- mv コマンド 見つかったファイルの名前を変更します。
- ls -l コマンド find コマンドの出力ファイルの詳細を取得します。
- md5sum find コマンドの出力ファイルについて
- wc コマンド find コマンドの出力ファイルの総単語数をカウントします。
- 任意の Unix シェル コマンドを実行します コマンド出力ファイルの検索
- または独自のカスタム シェル スクリプトを実行する / find コマンドの出力ファイルに対するコマンド
例 9:find コマンド出力の ls -l。過去 1 時間以内に編集されたファイルの長いリスト。
# find -mmin -60 ./cron ./secure # find -mmin -60 -exec ls -l {} \; -rw------- 1 root root 1028 Jun 21 15:01 ./cron -rw------- 1 root root 831752 Jun 21 15:42 ./secure
例 10:現在のファイル システムのみを検索する
システム管理者は、ルート ファイル システムを検索する必要がありますが、マウントされている他のパーティションは検索しません。複数のパーティションがマウントされている場合、および /.次のことができます。
次のコマンドは、/ から始まる *.log ファイルを検索します。つまり、/ (ルート) の下に複数のパーティションがマウントされている場合、次のコマンドはマウントされたすべてのパーティションを検索します。
# find / -name "*.log"
これは、現在のファイル システムでのみファイルを検索します。以下は、find man ページの xdev 定義です:
- -xdev 他のファイル システムのディレクトリを降りないでください。
次のコマンドは、/ (ルート) から始まり、現在のファイル システムでのみ *.log ファイルを検索します。つまり、/ (ルート) の下に複数のパーティションがマウントされている場合、次のコマンドはマウントされたすべてのパーティションを検索しません。
# find / -xdev -name "*.log"
例 11:同じコマンドで複数の { } を使用する
マニュアルによると、{} のインスタンスは 1 つだけ可能です。ただし、以下に示すように、同じコマンドで複数の {} を使用できます。
# find -name "*.txt" cp {} {}.bkup \;
この {} を同じコマンドで使用することは可能ですが、別のコマンドで使用することはできません。たとえば、次のようにファイルの名前を変更したい場合、期待した結果が得られません。
find -name "*.txt" -exec mv {} `basename {} .htm`.html \;
例 12:{ } を複数のインスタンスで使用する
以下に示すように、シェル スクリプトを記述してシミュレートできます。
# mv "$1" "`basename "$1" .htm`.html"
これらの二重引用符は、ファイル名のスペースを処理するためのものです。そして、find コマンドからそのシェル スクリプトを呼び出します 以下に示すように。
find -name "*.html" -exec ./mv.sh '{}' \;
したがって、何らかの理由で同じファイル名を複数回使用したい場合は、単純なシェル スクリプトを作成し、ファイル名を引数として渡すのが最も簡単な方法です。
例 13:エラーを /dev/null にリダイレクトする
エラーをリダイレクトすることはお勧めできません。経験豊富なユーザーは、エラーを端末に出力して修正することの重要性を理解しています。
特に、find コマンドでエラーをリダイレクトすることはお勧めできません。ただし、エラーを表示したくなくて null にリダイレクトしたい場合は、以下に示すように実行してください。
find -name "*.txt" 2>>/dev/null
たまには参考になります。たとえば、アカウントから / (ルート) の下にあるすべての *.conf ファイルを検索しようとすると、以下に示すように「許可が拒否されました」というエラー メッセージが大量に表示される場合があります。
$ find / -name "*.conf" /sbin/generate-modprobe.conf find: /tmp/orbit-root: Permission denied find: /tmp/ssh-gccBMp5019: Permission denied find: /tmp/keyring-5iqiGo: Permission denied find: /var/log/httpd: Permission denied find: /var/log/ppp: Permission denied /boot/grub/grub.conf find: /var/log/audit: Permission denied find: /var/log/squid: Permission denied find: /var/log/samba: Permission denied find: /var/cache/alchemist/printconf.rpm/wm: Permission denied [Note: There are two valid *.conf files burned in the "Permission denied" messages]
したがって、find コマンドの実際の出力だけを表示したい場合は、 以下に示すように、「許可が拒否されました」というエラー メッセージではなく、エラー メッセージを /dev/null にリダイレクトできます。
$ find / -name "*.conf" 2>>/dev/null /sbin/generate-modprobe.conf /boot/grub/grub.conf [Note: All the "Permission denied" messages are not displayed]
例 14:ファイル名のスペースをアンダースコアに置き換えます。
インターネットからダウンロードしたオーディオ ファイルには、ほとんどの場合、スペースが含まれています。しかし、ファイル名にスペースを含めることは、Linux 系のシステムにはあまり適していません。以下に示すように、検索コマンドと名前変更コマンドの組み合わせを使用して、スペースをアンダースコアで置き換えることにより、ファイルの名前を変更できます。
以下は、すべての *.mp3 ファイルのスペースを _ に置き換えます
$ find . -type f -iname “*.mp3″ -exec rename “s/ /_/g” {} \;
例 15:2 つの検索コマンドを同時に実行する
マニュアル ページの find コマンドの例に示されているように、以下は、1 回の走査で 2 つのコマンドを実行するために使用できる構文です。
次の find コマンドの例では、ファイル システムを 1 回だけトラバースし、setuid ファイルとディレクトリを /root/suid.txt にリストし、大きなファイルを /root/big.txt にリストします。
# find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \ \( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
他の 15 のサンプル シリーズ記事
- 15 の実用的な Unix 検索コマンドの例 – パート 1
- 15 の実用的な Linux grep コマンドの例
- 15 の例で Unix コマンドラインの歴史をマスター
- 15 の素晴らしい Sox コマンドの例を使用してオーディオ ファイルを操作する (Sound eXchange)
- 15 の高度な PostgreSQL コマンドの例
- 15 の優れた Google 検索のハック、ヒント、コツ
- 15 の高度な PostgreSQL DBA の例
- Mysqladmin コマンドの 15 の実用的な使用例
- 15 の素晴らしい Linux Cron ジョブの例
戻る必要がある場合は、del.icio.us でこのページをブックマークして参照してください。