Linux の
find
コマンドは、システム管理者が幅広い検索基準に基づいてファイルやディレクトリを見つけて管理できる強力なツールです。名前、タイプまたは拡張子、サイズ、権限などによってディレクトリとファイルを検索できます。
ファイルやディレクトリを検索するだけでなく、
find
コマンドを他のコマンドと組み合わせることで、結果に対してアクションを実行することもできます。
-exec
オプションを追加すると、システム管理者は外部コマンドを実行し、サイズや名前などの指定された基準に一致するファイルのコピー、移動、削除、アクセス許可の変更などのアクションを実行できるようになります。
この記事では、基本的な Linux の find コマンドを例を挙げて説明します。ここでは、ファイルとディレクトリを検索する方法を説明します。次に、
-exec
オプションを使用して、サイズや権限などに基づいてファイルまたはディレクトリを操作する方法を説明します。
find コマンドの一般的な構文は次のとおりです。
find {path} {name -of-file or dir-to-search} {action-to-take}
どこ、
-
path
ディレクトリを指定します。 -
name-of file or dir-to-search
: 検索するファイルまたはディレクトリの名前 -
action-to-take
: コピー、削除、移動など。
このチュートリアルでは、指定されたパターンに一致するファイルとディレクトリを見つける方法を説明します。また、find コマンドが見つけたファイルまたはディレクトリに対してアクションを実行する方法についても説明します。このガイドは Ubuntu に基づいていますが、ほとんどの Linux ディストリビューションとバージョンに適用できます。
ファイルとディレクトリの検索
名前または拡張子で特定のファイルを検索する
特定のファイルを検索するには、ルート (/) から次のコマンドを実行します。このコマンドには、検索しているファイルの正確な名前が含まれています。
find . -name file22.txt
出力
./test/file22.txt
./sales/file22.txt
結果にはパスが含まれることに注意してください。これは、ファイルがあるディレクトリがわからない場合、またはファイルが複数の場所にある場合に重要です。
現在の場所にあるまま、別のディレクトリでファイルを検索することもできます。この場合、検索するディレクトリのパスを指定する必要があります。
find ./test -name file22.txt
別のディレクトリで特定のファイルを探しています
私たちの場合は、test ディレクトリ内のレター ファイル から始まるすべてのファイルを検索します。
find ./test -name file*
出力
./test/file22.txt
./test/file30.doc
./test/file1.txt
./test/file5,doc
拡張子でファイルを検索する
Linux で特定の拡張子を持つファイルを検索するには、それをコマンドに追加します。
find . -name *.txt
出力
./test/subtest/subfil.txt
./test/file22.txt
./test/file1.txt
./home1/files32.txt
./home2/file22.txt
./qa/tags.txt
ファイルとディレクトリを名前で検索する
以下のコマンドを使用して、
qa
という文字で始まるファイルとディレクトリを検索します。私たちのコンピュータには、
qatree.txt
および
qa.txt
ファイルと、
qa
という名前のディレクトリがあります。
コマンドを実行すると、
find ./ -name "qa*"
次の出力が返されます
./test/qatree.pdf
./test/qa.txt
./home/qa
このコマンドは、検索条件に一致するファイルとディレクトリの両方を返します。ファイルまたはディレクトリのみを検索するには、コマンドでこれを指定する必要があります。
ファイルまたはディレクトリのみを検索する
ファイルの場合のみ、
type f
スイッチを使用します。
ファイルのみ
find ./ -type f -name "qa*"
出力
./test/qatree.pdf
./test/qa.txt
ディレクトリのみ
ディレクトリのみを検索するには、
type d
オプションを追加します。
find ./ -type d -name "qa*"
出力
./home/qa
大文字と小文字を区別しない検索コマンド
-name
スイッチを使用したすべての検索では大文字と小文字が区別され、大文字の結果は得られません。すべてのケースを取得するには、
-iname
オプションを使用します。
find ./ -iname "qa*"
出力
./test/qatree.pdf
./test/qa.txt
./test/QAtest.txt
./home/qa
複数のディレクトリからファイルを検索する
別のディレクトリでファイルを検索するには、コマンドにパスを追加します。この例では、
test
と
numeric
ディレクトリをチェックインします。
find ./test ./numeric -name file22.txt -type f
出力
./test/file22.txt
/root/numeric/file22.txt
すべてのディレクトリから異なる拡張子を持つ複数のファイルを検索します
find コマンドを使用すると、
*.doc
、
*.txt
*.pdf
などの異なる拡張子を共有する複数のファイルを見つけることができます。これは、一度に 1 つの拡張子ずつ個別に行うことも、すべての拡張子を含む 1 つのコマンドを使用することもできます。必要な拡張子。
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
出力
./test/subtest/subfil.txt
./test/qatree.pdf
./test/file22.txt
./test/qa.txt
./test/file30.doc
./books/acro.pdf
./data1/FILE22.txt
./docs/files32.txt
特定のテキストを含むファイルを検索する
特定のテキストを含むファイルにアクセスしたいが、そのファイル名や場所を思い出せない場合があります。このコマンドを使用すると、ターゲット テキストを含むすべてのファイルを検索できます。
「hyperconvergence」という単語を含むすべてのファイルを検索するには、次を使用します。
find / -type f -exec grep -l -i "hyperconvergence" {} ;
出力
/root/numeric/hci
/root/HCIP
–i
オプションを使用すると、コマンドで大文字と小文字が区別されず、大文字かどうかに関係なくテキストが検索されます (例: hyperconvergence 、 Hyperconvergence など)。
特定のディレクトリ内のファイルを検索するには、単にそれらのファイルをコマンドに追加します。
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
出力
./numeric/hci
grep コマンドの例をさらに詳しく見てみましょう。
サイズに基づいてファイルとディレクトリを検索する
特定のサイズ以下、特定の範囲内、または空のすべてのファイルまたはディレクトリを検索できます。検索するファイルまたはディレクトリの種類に応じて、適切なサイズ形式を使用してください。
サイズオプションには以下が含まれます。
c
– バイト
k
– キロバイト
M
– メガバイト
G
– ギガバイト
特定のサイズのファイルを検索します (30MB に相当)
検索するには 30MB のファイルをすべて検索します
find / -size 30M
指定したサイズより大きいファイルを検索する
find -size +2M
出力
. /Downloads/ubuntu18043.iso
./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
現在のディレクトリで 10MB 未満のファイルを検索する
find . -type f -size -10M
サイズが 100 ~ 200MB のファイルを検索する
100~200MBなど特定の範囲内のファイルを探す場合
find / -size +100M -size -200M
20kbを超えるディレクトリを探します
find / -type d -size +20k
空のファイルとディレクトリを見つけます。
ファイル
find ./ -type f -size 0
または
find ./ -type f –empty
ディレクトリ
find ./ -type d –empty
経過時間または変更時刻でファイルを検索する
n 日より古いファイルを検索する
find /path/ -type f -name '*.txt' -mtime +8
-mtime +8
8 日より古い
txt
ファイルを検索します。
変更日順
これにより、過去 17 時間以内に変更されたファイルが検索されます
find . -mtime -17 -type f
過去 10 日以内に変更されたディレクトリを探します
find . -mtime -10 -type d
アクセスまたは変更に基づいてファイルを検索する
アクセスした日付または時刻に基づいてファイルを検索します。これにより、指定した期間内にアクセスされたファイルまたはアクセスされていないファイルを確認できます。
ホーム ディレクトリ内で過去 10 日間アクセスされていないファイルを表示します。
find /home -atime +10
ちょうど 10 日前にアクセスされたファイル
find /home -atime 10
過去 10 日以内にアクセスされた
find /home -atime -10
過去 n 日以内に変更されたファイルを検索する
次のコマンドを使用して、過去 10 日以内に変更された
/home
ディレクトリ内のファイルを検索することもできます。
find /home -mtime -10
特定の期間内に変更されたファイルを検索します。
たとえば、ホーム ディレクトリ内の 6 ~ 15 日前に変更されたすべてのファイルです。
find /home -type f -mtime +6 -mtime -15
過去 10 分間にアクセスされたファイルとディレクトリ
過去 10 分間にアクセスされたファイルを検索するには、-amin オプションを使用します。
find . -amin -10 -type f
出力
./.bash_history
./.profileroot@ubuntu1804:~#
過去 10 分間にアクセスされたディレクトリ
find . -amin -10 -type d
特定の権限に一致するファイルを検索する
構文
$ find -perm mode
ここで、 mode は
644, 655, 700, 777
などの数値、または
u=x, a=r+x,
文字のいずれかの権限です。
モードは次の 3 つの異なる方法で指定できます。
- 指定された正確なアクセス許可を持つファイルを検索する場合は、接頭辞を付けません。
-
少なくとも指定された権限を持つファイルには「
-
」が付きます。これにより、指定されたアクセス許可と追加のより高いアクセス許可を持つファイルが返されます。 -
「
/
」を使用するには、ファイルに対するアクセス許可を持つ所有者またはグループを指定する必要があります。
権限 777 でファイルを検索する
find -perm 777
出力
./file1
少なくとも
766
のファイルを検索する
検索-パーマ-766
出力
./file2
./file1
このコマンドは、
- ファイル所有者には読み取り/書き込み/実行権限があります。
- グループには読み取り/書き込み権限があります
- 他の人は読み取り/書き込み権限を持っています
そのため、この基準を満たす 2 つのファイル (file1 と file2) が返されます。ファイルには正確な
766
アクセス許可が必要ではなく、追加のアクセス許可も含めることができますが、少なくとも指定されたアクセス許可が必要です。
所有者が書き込み可能なファイルを検索する
ここで、「
/
」を使用して、所有者、グループ、またはその他のユーザーが書き込み可能なファイルを検索します。
find -perm /222
.
./file2
./file3
./file1
上記の例では、所有者またはグループが書き込み可能なファイルを検索します。
これにより、どちらかで書き込み可能なファイルが返されますが、両方で書き込み可能である必要はありません。両方に書き込み権限があるファイルを表示するには、- 接頭辞を使用します。
find -perm -220
出力
./file2
./file1
ユーザーが所有するファイルを検索する
Jack が所有するすべてのファイルを検索する
find /home -user jack
出力
/home/jack
/home/jack/examples.desktop
/home/jack/.gnupg
/home/jack/.gnupg/private-keys-v1.d
/home/jack/ans.cgi
ユーザーが所有する特定のファイルを検索する
Jack が所有するすべてのテキスト ファイルを検索する
find /home -user jack -iname "*.txt"
出力
/home/jack/docs/file32.txt
ファイルとディレクトリを検索し、その権限とともにリストします。
find -name "*.conf" | ls -l
出力
total 120
drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2
drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop
drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents
drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads
-rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc
drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23
-rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
結果を見つけてそれに基づいて行動する
このセクションでは、find コマンドで指定されたパターンに一致するファイルに対してどのように対処できるかを見ていきます。
ファイルを検索して権限を変更する
特定のファイルタイプの権限を検索して変更します。この例では、以下に示すように、異なる権限を持つ PHP ファイルを操作します。
jack@ubuntu1804:~/ver$ ls -la
total 8
drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 .
drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php
-rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php
-rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php
-rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
次に、すべての PHP ファイル (上記) を検索し、そのアクセス許可を 755 に置き換えます。
find ver -name "*.php" -type f -exec chmod 755 {} ;
このコマンドは、
ver
ディレクトリで PHP ファイルを検索し、そのアクセス許可を
755
(
rwxr-xr-x
) に設定します。
結果
jack@ubuntu1804:~/ver$ ls -la
total 8
drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 .
drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 ..
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php
-rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
ファイルとディレクトリのアクセス許可を検索して変更する
644 のアクセス許可を持つファイルを検索し、655 のアクセス許可を持つように変更します。
find . -type f -perm 644 -exec chmod 655 {} ;
また、644 のアクセス許可を持つディレクトリを検索し、これを 755 に置き換えることもできます。
find . -type d -perm 644
出力
./docs
docs フォルダーには 644 のアクセス許可があります
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
755
に設定するには、次のコマンドを実行します。
find . -type d -perm 644 -exec chmod 755 {} ;
これで、
755
正確に何なのかをもう一度確認できるようになりました。
find . -type d -perm 755
出力
。
./docs
上から、root ディレクトリと docs ディレクトリに 755 のアクセス許可があることがわかります。
Ls –la
コマンドにより、次の詳細が得られます。
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
ファイルまたはディレクトリを検索してコピーする
特定のファイルを検索してディレクトリにコピーする
以下のコマンドは、
file22.tx
t ファイルを見つけて、
~/tmp/images
ディレクトリにコピーします。
find -iname file22.txt -exec cp {} ~/tmp/images ;
1 種類のファイルを検索してディレクトリにコピーする
現在のディレクトリで拡張子が
jpg
の画像などのファイルを検索し、画像フォルダーなどの別の場所にコピーするには、次を使用します。
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
これにより、すべての jpg ファイルが検索され、
~/tmp/images
フォルダーにコピーされます。
1 つのファイルを検索して複数のディレクトリにコピーする
単一のディレクトリを検索して複数のディレクトリにコピーします。
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
これにより、
hci
ファイルが検索され、
/tmp/dir1/ /tmp/dir2/
および
$HOME/3/
の 3 つのディレクトリにコピーされます。
ファイルを検索して別のディレクトリに移動する
既知のファイルをディレクトリから別のディレクトリに移動すること。
universal.php
ファイルを移動するには;
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
特定の拡張子を持つファイルを検索して別のフォルダーに移動します
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
特定のファイルを見つけて、特定の別のフォルダーに移動する
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
このコマンドは、名前が
uni
で始まり、任意の拡張子を持つすべてのファイルを検索します。次に、それらをディレクトリ
/unifiles/
に移動します。
経過時間に基づいてファイルを検索して移動する
指定した日数より古いファイルを検索し、アーカイブなどの別の場所に移動します。
find /path/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
これにより、20 日より古い PDF ファイルが検索され、backup1 ディレクトリに移動されます。
ファイルとディレクトリを検索して削除する
現在のディレクトリ内のファイルまたはディレクトリを検索して削除するための構文は次のとおりです。
find . -type f -name "file to delete" -exec rm -f {} ;
ファイルのみを削除するか、
find . -type d -name "dir-to-delete" -exec rm -rf {} ;
ディレクトリのみを削除するには
特定のファイルのみを検索して削除する
til で始まるファイルを検索して削除するには、次を使用します。
find . -type f -name "til*" -exec rm {} ;
til で始まるディレクトリを検索して削除するには
find . -type d -name "til*" -exec rm {} ;
ファイルとディレクトリの両方を削除します
find . -name "til*" -exec rm -rf {} ;
これにより、til の文字で始まるファイルとディレクトリの両方が削除されます。
拡張子で削除
以下は、現在のディレクトリ内のすべての
txt
ファイルを見つけて削除する方法です。
txt
を、
bak
、
pdf
など、削除したい別の拡張子に置き換えます。
find . -type f -name "*.txt" -exec rm -f {} ;
各ファイルを削除する前にシステムに確認を求めるプロンプトを表示したい場合は、以下のように -i オプションを追加します。
find . -type f -name "*.txt" -exec rm -i {} ;
出力
rm: remove regular empty file './File22.txt'? y
rm: remove regular empty file './file22.txt'? y
rm: remove regular empty file './file23.txt'?
デフォルトでは、
-rm
ディレクトリを削除しないため、確実に再帰的に削除するには、
–r
オプションを使用する必要があります。これにより、空のディレクトリとファイルを含むディレクトリが確実に削除されます。
-f
オプションは削除を強制し、ファイルとディレクトリの両方に使用されます。
n 日より古いファイルを検索して削除する
現在のディレクトリから 20 日より古いバックアップ ファイルを検索して削除します。
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
これにより、20 日以上経過したすべての .bak ファイルが削除されます。
ディレクトリのみを検索して削除する
dir22
というディレクトリを削除するには
find . -type d -name dir22 -exec rm -rf {} ;
ディレクトリ名の大文字と小文字が一致していることを確認するか、
-iname
オプションを使用してください。
find . -type d -iname Dir22 -exec rm -rf {} ;
Dir22
と
dir22
の両方を削除します
削除する前に確認するには、-i オプションを使用します。
find . -type d -iname Dir22 -exec rm -rf -i {} ;
出力
rm: ディレクトリ「./Dir22」を削除しますか? n
rm: ディレクトリ「./dir22」を削除しますか? y
この例では、削除されないディレクトリ
Dir22
には
n
を入力し、削除されるディレクトリ
dir22
には
y
を入力しました。
空のファイルを見つけて削除する
次のコマンドのいずれかを使用して、空のファイルを見つけて自動的に削除できます。
find ./ -type f -size 0 -exec rm -f {} ;
または
./ -type f -size 0 | を見つけます。 xargs rm -f
または
find ./ -type f -size 0 –delete
空のディレクトリを見つけて削除する
空のディレクトリを削除するには、
d
オプションを使用します。
find ./ -type d -empty -exec rmdir {} ;
もう 1 つの方法は、削除の代わりに削除を使用することです。
find ./ -type d -empty -delete
コンピュータからシステム ファイルや重要なファイルを削除すると、オペレーティング システムやアプリケーションが損傷したり、重要なデータが失われる可能性があることに注意してください。
誤って削除しないようにするには、root 以外のユーザー アカウントを使用することをお勧めします。また、役に立たない適切なファイルを削除していることと、万が一に備えてすべてのデータ ファイルのバックアップがあることを確認してください。
次は何ですか?
ラボまたは非運用環境で上記の Linux find コマンドを試してください。 Crontab を使用してファイル システムのクリーンアップを自動化できるかどうかを確認してください。 Linux をマスターするには、この オンライン コース をチェックしてください。