サーチ…
前書き
findは、条件に一致するファイル(またはディレクトリ)のディレクトリを再帰的に検索し、選択したファイルに対して何らかのアクションを実行するコマンドです。
search_path selection_criteriaアクションを見つける
構文
- [-H] [-L] [-P] [-Dデバッグオプション] [-Olevel] [path ...] [expression]
名前または内線番号でファイルを検索する
pwd
に相対的な、特定の名前のファイル/ディレクトリを探すには:
$ find . -name "myFile.txt"
./myFile.txt
特定の拡張子を持つファイル/ディレクトリを検索するには、ワイルドカードを使用します。
$ find . -name "*.txt"
./myFile.txt
./myFile2.txt
多くの拡張機能の1つと一致するファイル/ディレクトリを見つけるには、 or
フラグを使用します。
$ find . -name "*.txt" -o -name "*.sh"
abcで始まり1桁のアルファベットで終わるファイル/ディレクトリを見つけるには:
$ find . -name "abc[a-z][0-9]"
特定のディレクトリにあるすべてのファイル/ディレクトリを検索するには
$ find /opt
ファイルのみ(ディレクトリではない)を検索するには、 -type f
:
find /opt -type f
(正規ファイルではなく)ディレクトリのみを検索するには、 -type d
:
find /opt -type d
ファイルをタイプ別に検索する
ファイルを見つけるには、 -type f
フラグを使います
$ find . -type f
ディレクトリを見つけるには、 -type d
フラグを使います
$ find . -type d
ブロックデバイスを見つけるには、 -type b
フラグを使用します
$ find /dev -type b
シンボリックリンクを見つけるには、 -type l
フラグを使います
$ find . -type l
見つかったファイルに対してコマンドを実行する
時々、たくさんのファイルに対してコマンドを実行する必要があります。これはxargs
を使って行うことができます。
find . -type d -print | xargs -r chmod 770
上のコマンドは再帰的にすべてのディレクトリ( -type d
)を見つけ出します.
(あなたの現在の作業ディレクトリです)、 chmod 770
を実行します。 xargs
がファイルをfind
なかった場合、 -r
オプションはxargs
を指定してchmod
実行しません。
ファイル名やディレクトリにスペース文字が含まれていると、このコマンドが実行される可能性があります。ソリューションは、以下を使用することです
find . -type d -print0 | xargs -r -0 chmod 770
上記の例では、 -print0
と-0
フラグは、ファイル名を使用して分離されるように指定null
バイトを、そしてファイル名に、スペースなどの特殊文字を使用することができます。これはGNU拡張であり、 find
やxargs
他のバージョンでは動作しないかもしれません。
これを行うための好ましい方法は、スキップすることですxargs
コマンドをしてみましょうfind
サブプロセス自体を呼び出します。
find . -type d -exec chmod 770 {} \;
ここで、 {}
は、その時点でファイル名を使用することを示すプレースホルダーです。 find
は各ファイルに対して個別にchmod
を実行します。
代わりに、すべてのファイル名をchmod
1回の呼び出しに渡すことができます。
find . -type d -exec chmod 770 {} +
これは上記のxargs
スニペットの動作です。 (各ファイルを個別に呼び出すには、 xargs -n1
を使用します)。
3番目のオプションは、ファイル名のリストの上にbash loop find
出力をfind
です:
find . -type d | while read -r d; do chmod 770 "$d"; done
これは構文的に最も厄介ですが、見つかったファイルごとに複数のコマンドを実行したいときに便利です。しかし、これは奇妙な名前のファイル名に直面しても安全ではありません 。
find . -type f | while read -r d; do mv "$d" "${d// /_}"; done
ファイル名のすべてのスペースがアンダースコアに置き換えられます。 (この例は、先頭のディレクトリ名にスペースがある場合も機能しません)。
上記の問題は、 while read -r
が1行に1つのエントリを必要としますが、ファイル名に改行を含めることができます(また、 read -r
は後続の空白を失います)。あなたは物事を回してこれを修正することができます:
find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +
このように、 -exec
は、完全に正確で移植可能な形式でファイル名を受け取ります。 bash -c
はそれらを引数の数として受け取ります。これは$@
で正しく引用されます(スクリプトはこれらの名前を正しく処理する必要があります)。ファイル名を含む変数はすべて二重にする必要があります引用符。)
神秘は_
最初の引数がするので、必要であるbash -c 'script'
移入するために使用される$0
。
アクセス/変更時刻によるファイルの検索
ext
ファイルシステムでは、各ファイルには、格納されたAccess、Modification、および(Status)Change時間が関連付けられています。この情報を表示するには、 stat myFile.txt
を使用します。 find内のフラグを使用して、特定の時間範囲内で修正されたファイルを検索することができます。
最後の2時間以内に変更されたファイルを検索するには:
$ find . -mmin -120
過去2時間以内に変更されていないファイルを検索するには :
$ find . -mmin +120
上記の例では、 変更された時刻のみを検索しています。つまり、 ccess timesまたはc hanged timesで検索し、それに応じてc
またはc
使用a
ます。
$ find . -amin -120
$ find . -cmin +120
一般的なフォーマット:
-mmin n
:ファイルはn分前に修正されました
-mmin -n
: n分前にファイルが変更されました
-mmin +n
:ファイルがn分以上前に変更された
最後の2日以内に変更されたファイルを検索します。
find . -mtime -2
過去2日間に修正されていないファイルを検索する
find . -mtime +2
アクセス時間と状態変更時間はそれぞれ-atime
と-ctime
を使用します。
一般的なフォーマット:
-mtime n
:ファイルがnx24時間前に変更されました
-mtime -n
:ファイルがnx24時間未満で修正されました
-mtime +n
:ファイルがnx24時間以上前に変更されました
2007-06-07から2007-06-08 までの日付範囲で変更されたファイルを検索:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
1時間前から10分前までのタイムスタンプの範囲 (ファイルをタイムスタンプとして使用)でアクセスされたファイルを検索する:
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print
一般的なフォーマット:
-newerXY reference
:現在のファイルのタイムスタンプを-newerXY reference
比較します。 XY
:以下のいずれかの値を持つことができるat
(アクセス時間)、 mt
(更新時刻)、 ct
(変更時刻)とよりを。 reference
は、指定されたタイムスタンプ(アクセス、変更、変更)または絶対時間を表す文字列を比較するファイル wheの名前です 。
特定の拡張子でファイルを検索する
現在のパス内の特定の拡張子のすべてのファイルを検索するには、次のfind
構文を使用します。これは、 .extension
を持つすべての名前と一致するようにbash's
組み込みglob
構造を利用することによって.extension
ます。
find /directory/to/search -maxdepth 1 -type f -name "*.extension"
現在のディレクトリだけからタイプ.txt
すべてのファイルを検索するには、次のようにします。
find . -maxdepth 1 -type f -name "*.txt"
サイズに応じたファイルの検索
15MBを超えるファイルを検索する:
find -type f -size +15M
12KB未満のファイルを検索する:
find -type f -size -12k
正確に12KBサイズのファイルを見つける:
find -type f -size 12k
または
find -type f -size 12288c
または
find -type f -size 24b
または
find -type f -size 24
一般的なフォーマット:
find [options] -size n[cwbkMG]
nブロックサイズのファイルを探します。ここで+ nはnブロック以上を意味し、-nはnブロック未満を意味し、n(任意の符号なし)は正確にnブロックを意味します
ブロックサイズ:
-
c
:バイト -
w
:2バイト -
b
:512バイト(デフォルト) -
k
:1KB -
M
:1 MB -
G
:1 GB
パスをフィルタリングする
-path
パラメーターを使用すると、結果のパスに一致するパターンを指定できます。パターンは名前自体にも一致します。
パス(フォルダまたは名前)の任意の場所にlog
を含むファイルのみを検索するには:
find . -type f -path '*log*'
log
というフォルダ内のファイルのみを検索するには(すべてのレベルで):
find . -type f -path '*/log/*'
log
またはdata
というフォルダ内のファイルのみを検索data
:
find . -type f -path '*/log/*' -o -path '*/data/*'
bin
というフォルダに含まれているファイル以外のすべてのファイルを見つけるには:
find . -type f -not -path '*/bin/*'
すべてのファイルを見つけるには、 bin
やlogファイルというフォルダに含まれているファイル以外のすべてのファイルを探します。
find . -type f -not -path '*log' -not -path '*/bin/*'