晴耕雨読

working in the fields on fine days and reading books on rainy days

PowerShellでfind (Get-ChildItem) を使う

PowerShell の Get-ChildItem コマンドレットと -Recurse オプションを使うことで、Linuxのfindコマンドに相当する処理を行うことができます。

find . -name (ファイル名検索)

拡張子が txt のファイルの一覧を再帰的に探す find . -name '*.txt' に相当するPowerShellは、Get-ChildItem と -Filter オプションを使用します。

Get-ChildItem -Recurse -Filter "*.txt"

find . -type d (ディレクトリ指定)

ディレクトリのみを再帰的に探す find . -type d に相当するPowerShellは、Get-ChildItem と -Directory オプションを使用します。

Get-ChildItem -Recurse -Directory

find . -exec (結果に対する処理)

見つけたファイルに対して処理を行う find . -exec echo {} \; に相当するPowerShellは、Get-ChildItem と ForEach-Object を組み合わせて使用します。 ForEach-Object は入力に対する繰り返し処理をしてくれます。 以下は、見つけたファイルのフルパスを表示するためのコマンド例です。

Get-ChildItem -Recurse -Filter "*.csv" | foreach { Write-Output $_.FullName }

find . -print (表示方法)

見つけたファイルをパスだけを表示する find . -print に相当するPowerShellは、Get-ChildItem と -Name オプションを使用します。

Get-ChildItem -Recurse -Name

find . -maxdepth (最大深さ)

再帰する最大の深さのレベルを指定する find . -maxdepth 3 に相当するPowerShellは、Get-ChildItem と -Depth オプションを使用します。

Get-ChildItem -Recurse -Depth 3

find . -mmin -5 (修正時間)

5分以内に修正されたファイルを見つける find . -mmin -5 に相当するPowerShellは、Get-ChildItem と Where-Object を組み合わせて使用します。 Where-Object は入力に対するフィルター処理をしてくれます。

Get-ChildItem -Recurse | where { $_.LastWriteTime -gt (Get-Date).AddMinutes(-5) }

find . | grep -E (結果のフィルタリング)

見つけたファイルを正規表現でフィルタリングする find . | grep -E に相当するPowerShellは、where の中で正規表現マッチをすることで実現します。 以下は、拡張子が .txt か .png のファイル かつ パス中に dest フォルダを含まない場合、そのファイルのフルパスを表示する例です。

Get-ChildItem -Recurse |
    where {
        $_.Name -match "\.(txt|png)$" -and
        $_.FullName -notmatch "\\dest\\"
    } |
    foreach {
        Write-Output $_.FullName
    }

以上です。

参考文献