使い方
カレントディレクトリ以下でファイル名にキーワードが含まれるファイル及びディレクトリを探す。
$ find . -name *hoge*
注意事項
- ワイルドカード
*
はピリオド.
に一致しない。
参考:
find コマンド – ファイルなどを検索する!詳細まとめ | エンジニアの入り口
find コマンドで覚えておきたい使い方 12個 (+1個) | 俺的備忘録
find コマンドの使い方 | UNIX/Linux の部屋
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 \)
カッコの内側を先に処理する。カッコはシェルによって解釈されないようにクォートする必要がある。
パス付きのファイル名を標準出力に表示し、各ファイル名の後ろに改行文字を付ける。真を返す。
-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)
参考:
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
参考:
シェルスクリプトで空ディレクトリを再帰的に検索し削除する | ゲンゾウ用ポストイット
空ディレクトリを、そのパスを表示しながら再帰的に削除するには? – スタック・オーバーフロー