使い方

参考:

find コマンド | hydrocul のメモ

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

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

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

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

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

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

式 (expression)

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

-name

-name pattern

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

-path

-path pattern

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

-not

-not expr

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

-o / -or

expr1 -o expr2

or 結合である。expr1 が真ならば、expr2 は評価されない。

expr1 -or expr2

expr1 -o expr2 と同じだが、POSIX 準拠の表現ではない。

-a / -and

expr1 -a expr2

expr1 expr2 と同じ。

expr1 -and expr2

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

( expr )

\( 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"; \ done
Code language: Bash (bash)

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

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

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

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

参考:

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

正規表現を使う

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

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

参考:

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

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

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

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

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

$ find . -type d -empty

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

$ find . -type d -empty -delete

参考:

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

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

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

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

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

リファレンス

Man page of FIND | JM Project

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

コメントを残す

メールアドレスが公開されることはありません。

Protected by reCAPTCHA