異なるサブディレクトリ内の同じ名前のフォルダの内容を削除する

異なるサブディレクトリ内の同じ名前のフォルダの内容を削除する

Windows 10を使用しています。

ベース ディレクトリ (ここでは「d:\dir」) の異なるサブディレクトリに、同じ名前のフォルダー (名前は「data」と仮定) が多数あります。

「data」という名前のすべてのフォルダーの内容(ファイルのみを含む)を、フォルダー自体を削除せずに削除するにはどうすればよいですか?

たとえば、3 つのフォルダーの場合:

d:\dir\データ
d:\dir\tmp1\データ
d:\dir\tmp3\tmp2\データ

答え1

dataWindows コマンド プロンプト ウィンドウ内から次のコマンド ラインを使用すると、のすべてのディレクトリD:\dirとそのサブディレクトリ内のすべてのファイル (フォルダーではない) を削除できます。

for /F "delims=" %I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| findstr /E /I /C:"\data"') do @del /A /F /Q "%I\*"

同じコマンド ラインは、Windows バッチ ファイルでは次のように記述されます。

@echo off
for /F "delims=" %%I in ('dir "D:\dir\*data" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /C:"\data"') do del /A /F /Q "%%I\*"

コマンドのために%ComSpec% /Cコマンドラインでバックグラウンドで開始された別のコマンド プロセスで実行されます。

dir "D:\dir\*data" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /I /E /C:"\data"

環境変数は通常、次のようComSpecに定義されます。%SystemRoot%\System32\cmd.exeシステムWindows の環境変数コントロール パネル - システム - システムの詳細設定 - 環境変数...環境変数はSystemRootデフォルトでWindowsディレクトリへのパスで定義されます。言い換えるとのためにほとんどのWindows PCでは、C:\Windows\System32.exeオプション/Cとコマンドラインを('との間に指定することでデフォルトで実行されます')。定義済みのコマンドの一覧については、Wikipediaの記事も参照してください。Windows 環境変数

コマンドディレクター処理する出力標準出力(標準出力)

  • オプションのため、ベアフォーマットで/B
  • /ADオプション(属性ディレクトリ)のため、ディレクトリ名のみ
  • オプションのためフルパス付き/S
  • ワイルドカードパターンに一致する*data
  • 指定されたディレクトリ内D:\dir
  • およびそのすべてのサブディレクトリもオプションにより削除されます/S

ディレクター処理するためのエラーメッセージを出力する標準エラー出力(標準エラー)これらの条件に一致するディレクトリエントリがない場合。このエラーメッセージはデバイスにリダイレクトすることで抑制されます。ヌル2>nul

つまり、ディレクター例としては、次のようになります。

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

の出力ディレクター扱う標準出力リダイレクトされて|処理されます標準入力(標準入力)次のコマンド検索文字列

検索文字列ストリームから読み取った検索標準入力1行ずつ

  • オプションのため大文字と小文字は区別されません/I
  • 文字通り解釈された文字列\data
  • オプションのため、行末になければなりません/E

それで検索文字列処理する出力標準出力バックグラウンド コマンドは\data、次の例のように、行末にあるすべての行を処理します。

D:\dir\data
D:\dir\tmp1\data
D:\dir\tmp3\tmp2\data

コマンドの出力のフィルタリングディレクター検索文字列MyDataのような名前のディレクトリを除外する必要がある。ディレクターワイルドカードが必要なため、そのサブディレクトリのすべてのサブディレクトリではなく、そのサブディレクトリ内のすべてのディレクトリ*が出力されます。D:\dir\datadataD:\dir

Microsoftの記事を読むコマンドリダイレクト演算子の使用2>nulおよびの説明については、を参照してください|。リダイレクト演算子>およびは、キャレット文字|でエスケープする必要があります。^のためにWindowsコマンドインタープリタがコマンドを実行する前にこのコマンドラインを処理するときに、コマンドラインがリテラル文字として解釈されるのためにdir埋め込まれたコマンド ラインをバックグラウンドで開始された別のコマンド プロセスで実行します。

のためにオプションを使用すると、/F最終的に処理するすべての出力をキャプチャします標準出力開始されたコマンド プロセスを実行し、開始されたプロセスの終了後にこの出力を 1 行ずつ処理しますcmd.exe

空行は常に無視されますのために、しかし、出力された空行は存在しない。ディレクターそして検索文字列

のために;デフォルトでは、デフォルトの行末文字であるaで始まる行もすべて無視されます。ただし、のためにこの場合、すべての行が で始まるため、セミコロンで始まることはありませんD:。したがって、デフォルトeol=;を維持できます。それ以外の場合は、eol=|ファイル/フォルダー名に縦線を含めることができないため、ファイル/フォルダー名リストを処理するのに通常は最適です。

のためにデフォルトでは、通常のスペースと水平タブ文字を文字列区切り文字として使用して各行を部分文字列に分割し、最初のスペース/タブで区切られた文字列のみを指定されたループ変数に割り当てますI。ディレクトリのパスのフォルダー名には、dataスペース文字を含めることができます。そのため、 で空の区切り文字リストが指定され、行分割動作が無効になり、見つかったフォルダーの完全修飾名が常にdelims=ループ変数に割り当てられるようになります。Idata

のためにコマンドdataに割り当てられたすべてのディレクトリに対して実行されます。I

del /A /F /Q "%I\*"

%I実行前に置き換えられます削除ループ変数に現在割り当てられている完全修飾ディレクトリ名によってI

コマンド削除はファイルを削除するものです。ディレクトリは削除しません。このオプションは、/A隠し属性が設定されているファイルを含む、属性に関係なくすべてのファイルを削除するために使用されます。削除オプション なしでは削除されません/A/F読み取り専用属性が設定されたファイルの削除を強制するには、オプション が必要です。このオプションは、 で一致するすべてのファイルを で削除するかどうかをユーザーに尋ねるクエリを抑制するために使用されます/F/Q*削除

完全修飾ディレクトリ名は、スペースや、コマンドの引数文字列を囲むのに&()[]{}^=;!'+,`~の使用を必要とするこれらの文字のいずれかを含む可能性があるため、二重引用符で囲む必要があります。"CMDF コマンドプロンプトウィンドウで実行したときに出力される最後のヘルプページcmd /?

その点に注意してください削除ユーザーにファイルを削除する NTFS 権限がないか、アプリケーションによって開かれているときにファイルの削除ができないような方法でアプリケーションによって開かれているファイルは削除できません。削除NTFS またはファイル アクセス権限がないため削除できないファイルごとにエラー メッセージを出力します。

使用されるコマンドとその動作を理解するには、コマンド プロンプト ウィンドウを開き、そこで次のコマンドを実行し、各コマンドに対して表示されるすべてのヘルプ ページを注意深く読んでください。

  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?

答え2

あなたの例に従うと、次のように呼び出す必要があります:

Get-ChildItem -Recurse d:\dir | Where-Object { ($_.DirectoryName) -and (Split-Path $_.DirectoryName -Leaf) -eq 'data' } | Remove-Item

答え3

「data」という名前のすべてのフォルダーを再帰的に列挙し、その内容を削除します。

$base_dir = 'D:\dir'
$name     = 'data'

Get-ChildItem $base_dir -Recurse -Force | Where-Object {
    $_.PSIsContainer -and
    $_.Name -eq $name
} | Select-Object -Expand FullName | ForEach-Object {
    Remove-Item "$_\*" -Recurse -Force
}

$_.PSIsContainerPowerShell v3 以降では、パラメータを使用して-Directoryフィルター条件を置き換えることができますGet-ChildItem

関連情報