0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellで複数のtar.gzを一括展開する方法

0
Posted at

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-ChildItemForEach-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では、こうした「ある条件に一致するファイルすべてに同じコマンドを実行する」処理を比較的簡単に書けるため、ログファイルの一括処理などにも便利です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?