サーチ…


前書き

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拡張であり、 findxargs他のバージョンでは動作しないかもしれません。


これを行うための好ましい方法は、スキップすることです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 -nn分前にファイルが変更されました
-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ブロックを意味します

ブロックサイズ:

  1. c :バイト
  2. w :2バイト
  3. b :512バイト(デフォルト)
  4. k :1KB
  5. M :1 MB
  6. 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/*'


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow