使い方

カレントディレクトリ以下でファイル名にキーワードが含まれるファイル及びディレクトリを探す。

$ find . -name *hoge*
注意事項
  • ワイルドカード * はピリオド . に一致しない。

参考:

find コマンド – ファイルなどを検索する!詳細まとめ | エンジニアの入り口

find コマンド | hydrocul のメモ

find コマンドで覚えておきたい使い方 12個 (+1個) | 俺的備忘録

find コマンドの使い方 | UNIX/Linux の部屋

find コマンドの実用 | 方向性未定のブログ

Linux でファイルを探すときに使うコマンド メモ – Qiita

find コマンド 基本編 – ファイルをさまざまな条件で検索する | @IT

find コマンド 応用編 #1 – タイムスタンプでファイルを検索する | @IT

find コマンド 応用編 #2 – 検索したファイルを指定したフォーマットで表示する | @IT

find – ファイルやディレクトリを検索するコマンド | renoji.com

式 (expression)

コマンドライン上で探索開始点のリストの後ろに続く部分は、「式」 (expression) である。 式は、いわば問い合わせの細目のようなものであり、 どういうファイルがマッチするのかと、そのマッチしたファイルをどう処理するのかを記述している。 式は一連の要素からなっており、そうした式の要素、 特にオプション、検査、アクションをまとめて「述語」 (predicate) と呼ぶ。

-name

-name pattern

ファイルやディレクトリのベースネーム (パスから最後の要素だけを残して、先行するディレクトリを取り去ったもの) が、シェルのパターン pattern にマッチすれば、真を返す。

-path

-path pattern

ファイル名がシェルのパターン pattern にマッチすれば、真を返す。 メタ文字は、/. を例外扱いしない。

-not

-not expr

! expr と同じだが、POSIX 準拠の表現ではない。

論理和 (-o / -or)

expr1 が真、または、expr2 が真の時に結果が真となる。

expr1 -o expr2

-or は同じ動作となるが、POSIX 準拠ではない。

expr1 -or expr2

論理積 (-a / -and)

expr1 が真、かつ、expr2 が真の時に結果が真となる。-a は省略できる。

expr1 -a expr2

-and は同じ動作となるが、POSIX 準拠ではない。

expr1 -and expr2

括弧

\( expr \)

カッコの内側を先に処理する。カッコはシェルによって解釈されないようにクォートする必要がある。

-print

パス付きのファイル名を標準出力に表示し、各ファイル名の後ろに改行文字を付ける。真を返す。

-print0

パス付きのファイル名を標準出力に表示し、各ファイル名の後ろに ( -print が改行文字を付けるのとは違って) ヌル文字を追加する。 このアクションは、xargs-0 オプションに呼応している。真を返す。

-prune

処理対象のファイルがディレクトリの場合は、そのディレクトリ以下に降りて行かない。真を返す。

$ find . -path '*/node_modules/*' -prune -o -name '*.js' -print

パスの途中に node_modules を含むディレクトリを除いて、ファイル名が .js で終わるファイルを探索する。

ヌル文字区切りで出力する

ファイル名に特殊文字 (スペース/タブ/改行など) が含まれている場合、ヌル文字区切りで出力して処理する必要がある。

カレントディレクトリ直下のファイル/ディレクトリを while read でループ処理する。

while read -d "" file; do \
    printf "%q\n" "$file"; \
done < <( find . -d 1 -print0 )Code language: Bash (bash)

もしくは、グロブで for 文を回す。

for file in *; do \
    printf "%q\n" "$file"; \
doneCode language: Bash (bash)

ディレクトリのみを処理する。

for dir in */; do \
    printf "%q\n" "$dir"; \
doneCode language: Bash (bash)

ファイルのみを処理する。

for file in *; do \
    if [ -f "$file" ]; then \
        printf "%q\n" "$file"; \
    fi; \
doneCode language: Bash (bash)

参考:

find と xargs コマンドで -print0 オプションを使う理由 | 薫の Hack

Is there a reason why ls does not have a --zero or -0 option – Unix & Linux Stack Exchange

Reading null delimited strings through a Bash loop – Stack Overflow

looping through `ls` results in bash shell script – Super User

結果のパス先頭に付くドットとスラッシュを取り除く

Bash のパラメータ展開を使って取り除く。

while read file; do \
    echo "${file#./}"; \
done < <( find . -d 1 )Code language: Bash (bash)

もしくは、cut コマンドで取り除く。

while read file; do \
    echo "$file"; \
done < <( find . -d 1 ) \
    | cut -c 3-Code language: Bash (bash)

参考:

How to remove first dot from a list of file paths – Super User

Removing leading “./” in file paths – Apple Community

正規表現を使う

拡張正規表現を使うには、-regextype オプションに posix-egrep を指定し、-regex オプションを使う。

$ find . -regextype posix-egrep -regex '\./.*_[0-9]{3}\.(jpg|jpeg|png)'

Mac の場合、-E オプションをつけると -regex オプションに与えた文字列が拡張正規表現として解釈される。

$ find -E . -regex '\./app/assets/images/.*\.(jpg|jpeg|png|svg)'

参考:

find コマンドで正規表現を使う際には、ファイル名だけでなくパスで書く必要がある – Qiita

find コマンドで正規表現を使う (regextype / regex) | いろいろ備忘録日記

正規表現に合致するファイル名を find する方法 | grep Tips *

macOS の find コマンドで正規表現を使い、複数の拡張子を検索する – Qiita

find コマンドでファイル名正規表現検索 | clmemo@aka

空のディレクトリを削除する

空のディレクトリを列挙する。

$ find . -type d -empty

空のディレクトリを再帰的に削除する。

$ find . -type d -empty -delete

参考:

空のディレクトリをまとまて削除 | へっぽこ開発室

空のディレクトリを削除するには – Qiita

シェルスクリプトで空ディレクトリを再帰的に検索し削除する | ゲンゾウ用ポストイット

空のディレクトリを再帰的に消す | grep Tips

空ディレクトリを、そのパスを表示しながら再帰的に削除するには? – スタック・オーバーフロー

リファレンス

Man page of FIND | JM Project

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA