Windows環境で、あるフォルダ内に次のような形式のログファイルが大量にあるケースを想定します。
log-20260801.tar.gz
log-20260802.tar.gz
log-20260803.tar.gz
...
今回は、通常の展開では都合が悪く、tar コマンドに k オプションを付けて、
tar -xzkf log-20260801.tar.gz
のように展開する必要がありました。
ファイル数が100個程度あると1つずつ実行するのは大変なので、PowerShellで一括処理します。
結論
対象ファイルが存在するフォルダで、以下を実行します。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
tar -xzkf $_.FullName
}
これだけで、条件に一致するすべての .tar.gz ファイルを順番に展開できます。
コマンドの解説
まず、以下の部分で対象ファイルを取得しています。
Get-ChildItem -Filter "log-*.tar.gz"
Get-ChildItem は、PowerShellでファイルやフォルダの一覧を取得するコマンドです。
今回は -Filter を使って、
log-*.tar.gz
に一致するファイルだけを取得しています。
たとえば、以下のファイルが対象になります。
log-20260801.tar.gz
log-20260802.tar.gz
log-20260803.tar.gz
取得したファイルを、パイプライン | で ForEach-Object に渡します。
| ForEach-Object {
tar -xzkf $_.FullName
}
ForEach-Object は、渡されたファイルを1件ずつ処理します。
$_ は現在処理しているファイルを表します。
そのため、
$_.FullName
には現在処理中のファイルのフルパスが入ります。
たとえば実際には、次のようなコマンドが順番に実行されるイメージです。
tar -xzkf "C:\logs\log-20260801.tar.gz"
tar -xzkf "C:\logs\log-20260802.tar.gz"
tar -xzkf "C:\logs\log-20260803.tar.gz"
処理中のファイル名を表示する
ファイル数が多い場合は、現在どのファイルを展開しているのか表示すると分かりやすくなります。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
Write-Host "展開中: $($_.Name)"
tar -xzkf $_.FullName
}
実行すると、次のような表示になります。
展開中: log-20260801.tar.gz
展開中: log-20260802.tar.gz
展開中: log-20260803.tar.gz
大量のファイルを処理するときはこちらの方が安心です。
展開に失敗したファイルを確認する
tar コマンドの実行結果も確認したい場合は、$LASTEXITCODE を利用できます。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
Write-Host "展開中: $($_.Name)"
tar -xzkf $_.FullName
if ($LASTEXITCODE -ne 0) {
Write-Host "失敗: $($_.Name)"
}
}
$LASTEXITCODE には、直前に実行した外部コマンドの終了コードが入ります。
終了コードが 0 以外だった場合に、
失敗: log-20260803.tar.gz
のように表示します。
対象フォルダへ移動してから実行する
たとえばログファイルが以下にある場合、
C:\work\logs
最初にPowerShellで移動します。
cd C:\work\logs
その後、一括展開コマンドを実行します。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
Write-Host "展開中: $($_.Name)"
tar -xzkf $_.FullName
}
フォルダを移動せずに実行する
Get-ChildItem にフォルダを指定する方法もあります。
Get-ChildItem "C:\work\logs" -Filter "log-*.tar.gz" | ForEach-Object {
tar -xzkf $_.FullName
}
ただし、この場合でも tar の展開先は基本的に現在の作業ディレクトリになります。
展開先を明示したい場合は、tar の -C オプションを使います。
Get-ChildItem "C:\work\logs" -Filter "log-*.tar.gz" | ForEach-Object {
tar -xzkf $_.FullName -C "C:\work\logs"
}
まとめ
複数の .tar.gz をPowerShellから一括展開する場合は、Get-ChildItem と ForEach-Object を組み合わせると簡単です。
最小構成は以下です。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
tar -xzkf $_.FullName
}
処理状況も確認したい場合は、次の形にしておくと使いやすいです。
Get-ChildItem -Filter "log-*.tar.gz" | ForEach-Object {
Write-Host "展開中: $($_.Name)"
tar -xzkf $_.FullName
if ($LASTEXITCODE -ne 0) {
Write-Host "失敗: $($_.Name)"
}
}
PowerShellでは、こうした「ある条件に一致するファイルすべてに同じコマンドを実行する」処理を比較的簡単に書けるため、ログファイルの一括処理などにも便利です。