目次
Linuxを使用する場合、ファイルの検索によく使用するコマンドの1つはfindです。findの機能と使用法を理解すると、作業効率が向上します。以下では、findの使用法を具体例とともに説明します。
1.基本的な考え方
findコマンドは、指定されたディレクトリおよびサブディレクトリ内のファイル(通常のファイルおよびディレクトリを参照)を検索するために使用されます。
2.文法形式と一般的なパラメータ
2.1文法形式
検索[パス...] [式]
その中で、pathは検索パスであり、複数のパスはスペースで区切られています。式:オプションとアクションで構成されます。
2.2一般的なパラメータ
-name pattern:指定されたパターンに従ってファイルを検索します。
-inameパターン: -nameパラメーターと同じですが、大文字と小文字が区別されない点が異なります。
-タイプc:ファイルタイプcに従ってファイルを検索します。
それらの中で:cはファイルタイプを表し、可能な値は次のとおりです:
d:ディレクトリ;
f:通常のファイル。
l:シンボリックリンク。
s:ソケット;
c:特殊文字ファイル。
b:特別なブロックファイル。
p:コマンドパイプライン(FIFO)
-ctime n:過去n日間に変更されたファイルを検索します。
-cnewer file: ファイルfileよりも新しいファイルを検索します(「update」:変更時刻を指します)。
-exec commond {} \;:見つかったファイルでこのパラメーターにリストされているシェルコマンドを実行し、{}と\の間のスペースに注意してください。
-ok commond {} \;:関数とパラメータのモードは-execと同じですが、commondを実行するたびに、実行するかどうかを尋ねられます。Y/ Nを入力して選択します。
3、説明例
3.1 -name / -inameパラメーター
まず、現在のディレクトリにファイルreadme.mdを作成してから、パターン「* README.md」に一致する名前のファイルを見つけます。
[root@localhost go]# touch readme.md
[root@localhost go]# find . -name "*README.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
[root@localhost go]#
上記の例からわかるように、パターン「* README.md」を満たすファイルはすべて見つかりましたが、小文字のファイルreadme.mdは見つかりませんでした。パラメータ-inameを置き換えた結果を見てみましょう。
[root@localhost go]# find . -iname "*ME.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
./readme.md
[root@localhost go]#
ご覧のとおり、小文字のファイルreadme.mdも見つかりました。これが-nameと-inameの違いです。
PS: Linuxでは、iパラメーターは、コマンドで大文字と小文字が区別されないことを意味することがよくあります。
3.2型パラメータ
「* src」という名前のすべてのディレクトリを検索します。
[root@localhost go]# find . -type d -name "*src"
./src
./src/cmd/api/testdata/src
./src/cmd/go/testdata/modlegacy/src
./src/cmd/internal/src
./src/cmd/link/testdata/testPErsrc
./src/go/build/testdata/withvendor/src
[root@localhost go]#
上記の例からわかるように、パターン「* src」を満たすすべてのディレクトリが表示され、条件を満たす通常のファイルはリストされていません。
「* src」という名前のすべてのファイルを検索します。
[root@localhost go]# find . -type f -name "*src"
./src/cmd/compile/internal/syntax/testdata/issue20789.src
./src/cmd/compile/internal/syntax/testdata/issue23385.src
./src/cmd/compile/internal/syntax/testdata/issue23434.src
./src/cmd/compile/internal/syntax/testdata/issue31092.src
./src/cmd/compile/internal/syntax/testdata/sample.src
./src/go/parser/testdata/commas.src
./src/go/parser/testdata/issue11377.src
./src/go/parser/testdata/issue23434.src
……
上記の例からわかるように、「* src」のパターンに一致するすべての通常のファイルが見つかりました。ディレクトリは含まれていません。
3.3-ctimeパラメーター
まず、/ var / accountの下にtestCtimeファイルを作成してから、現在のディレクトリで最終日に変更されたファイルを検索します。
[root@localhost account]# ls
pacct
[root@localhost account]# touch testCtime
[root@localhost account]# find . -ctime -1
.
./testCtime
[root@localhost account]#
上記からわかるように、「。」とtestCtimeの両方が見つかりました。ここで、「。」は現在のディレクトリを表します。
3.4-cnewerパラメーター
まず、testOneとtestTwoの2つのファイルを作成してから、ディレクトリtestdirを作成して、testOneよりも新しいファイルを見つけます。
[root@localhost go]# touch testOne
[root@localhost go]# touch testTwo
[root@localhost go]# mkdir testdir
[root@localhost go]# find . -cnewer testOne
.
./testTwo
./testdir
[root@localhost go]#
上記のクエリ結果からわかるように、testOneよりも新しいファイルをクエリできます。
3.5 -exec / -okパラメーター
現在のディレクトリとサブディレクトリでパターン「README.md」に一致するファイルを検索し、コマンドls-lを実行して結果を取得します。
[root@localhost go]# find . -name "README.md" -exec ls -l {} \;
-rw-r--r--. 1 root root 1607 9月 10 00:57 ./README.md
-rw-r--r--. 1 root root 5066 9月 10 00:57 ./misc/trace/README.md
-rw-r--r--. 1 root root 5655 9月 10 00:57 ./src/cmd/compile/README.md
-rw-r--r--. 1 root root 7945 9月 10 00:57 ./src/cmd/compile/internal/ssa/README.md
-rw-r--r--. 1 root root 2834 9月 10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
-rw-r--r--. 1 root root 98 9月 10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
-rw-r--r--. 1 root root 8678 9月 10 00:57 ./src/cmd/vendor/golang.org/x/sys/unix/README.md
-rw-r--r--. 1 root root 577 9月 10 00:57 ./test/README.md
[root@localhost go]#
上記と同じように、パラメーターを-execから-okに変更し、次のように実行します。
[root@localhost go]# find . -name "README.md" -ok ls -l {} \;
< ls ... ./README.md > ? y
-rw-r--r--. 1 root root 1607 9月 10 00:57 ./README.md
< ls ... ./misc/trace/README.md > ? y
-rw-r--r--. 1 root root 5066 9月 10 00:57 ./misc/trace/README.md
< ls ... ./src/cmd/compile/README.md > ? y
-rw-r--r--. 1 root root 5655 9月 10 00:57 ./src/cmd/compile/README.md
< ls ... ./src/cmd/compile/internal/ssa/README.md > ? y
-rw-r--r--. 1 root root 7945 9月 10 00:57 ./src/cmd/compile/internal/ssa/README.md
< ls ... ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md > ? y
-rw-r--r--. 1 root root 2834 9月 10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
< ls ... ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md > ? y
-rw-r--r--. 1 root root 98 9月 10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
< ls ... ./src/cmd/vendor/golang.org/x/sys/unix/README.md > ? N
< ls ... ./test/README.md > ? N
[root@localhost go]#
上記の例からわかるように、ls -lコマンドを実行するたびに、実行するかどうかを尋ねられます。
4、まとめ
findの一般的なパラメータは上記のとおりです。findの検索は再帰検索であることに注意してください。たとえば、現在のディレクトリで検索する場合、デフォルトで現在のディレクトリとサブディレクトリ内のファイルが検索されます。
5、参照
[1] https://www.runoob.com/linux/linux-comm-find.html
[2] https://man7.org/linux/man-pages/man1/find.1.html