web-dev-qa-db-ja.com

ワイルドカードフォルダからファイルを削除するバッチファイル

複数のディレクトリからファイルを削除するバッチファイルを作成するにはどうすればよいですか?

D:\L1\asdasda\L3\*.txt
D:\L1\dfghfghfh\L3\*.txt
D:\L1\tyutyugj\L3\*.txt
D:\L1\ytrtyrty\L3\*.txt

お気に入り:

D:
del "d:\L1\*\L3\*.txt"

barlop-questionerによる注記-

私はそれらのディレクトリを約100個持っています。フォルダは削除せず、ファイルのみを削除します。それらはすべてL3フォルダーを持っており、すべて同じ拡張子のファイルがいくつか含まれています。これらは単なる一時ファイルですが、自動的に削除されるわけではありません。

2
Andrew Lay

サブフォルダ名にワイルドカードを使用して動的に異なる名前のサブフォルダから削除するバッチファイル

ワイルドカードフォルダからファイルを削除するバッチファイル

これは、このタイプのタスクを常に完了するために使用する簡単で単純なバッチスクリプトの例です。説明するように、ニーズに合わせて可変フォルダーパスをプラグインしました。

サンプルバッチスクリプト

(変数ルートフォルダーとサブフォルダーを一番上に設定すると、それに応じてFOR /DループとFORループが繰り返され、ロジックが指定するようにディレクトリをトラバースする残りの魔法が実行されます。 DEL /Q /Fファイルの*.txtコマンドを完了します)

@ECHO ON

SET SourceDir=D:\L1
SET SourceSubDir=L3

:: --// note the asterisk wildcard after SourceDir in the first FOR /D loop using X as the variable
:: --// note the X variable appended to the beginning of the second FOR (no /D switch here) loop in the SET part using Y as the variable
FOR /D %%X IN ("%SourceDir%\*") DO FOR %%Y IN ("%%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%%~Y"
GOTO EOF

注:コマンドプロンプトで手動でコピーアンドペーストしてこれを実行する場合は、FORの変数ループでは、すべての部分でパーセント記号の1つを削除する必要があるため、バッチスクリプトではなくコピーアンドペーストを使用して手動で実行し、それを実行する場合は、その部分に以下を使用してくださいこれが上記の例の仕組みです。

FOR /D %X IN ("%SourceDir%\*") DO FOR %Y IN ("%~X\%SourceSubDir%\*.txt") DO DEL /Q /F "%~Y"

さらなる詳細と調査

(この詳細を表示するには、WindowsコマンドプロンプトでFOR /?と入力してください)

FOR(スイッチなし)

Runs a specified command for each file in a set of files.

FOR %variable IN (set) DO command [command-parameters]

  %variable  Specifies a single letter replaceable parameter.
  (set)      Specifies a set of one or more files.  Wildcards may be used.
  command    Specifies the command to carry out for each file.
  command-parameters
             Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %%variable instead
of %variable.  Variable names are case sensitive, so %i is different
from %I.

If Command Extensions are enabled, the following additional
forms of the FOR command are supported:

FOR/D

FOR /D %variable IN (set) DO command [command-parameters]

    If set contains wildcards, then specifies to match against directory
    names instead of file names.
0
Pimp Juice IT

行\ L1\*\L3\*を解釈します。 As:特定のディレクトリL1について、サブディレクトリL3を持つすべてのサブディレクトリを検索し、その中のすべてのファイルを削除します。

ディレクトリ構造をウォークするためのスクリプトを作成する必要があります。バッチファイルとしては簡単に実行できません。ディレクトリまたはファイルのリストを取得し、それらに対して繰り返しアクションを実行する方法があるPerlまたはPowerShellを使用する必要がある場合があります。

擬似コードで

Get list directories
For each dir 
  Cd into it
  Check if The dir L3 exists
  If it does then del .\L3\*.* 
  Go back up a level
Next dir

違いを確認するためだけにPowerShellでやり直すことを考えていますが、これについて考え、バッチファイルコードで実行します。

考えてみました

このバッチファイルは、isが実行されている場所からディレクトリ構造をウォークし、「L3」という名前のディレクトリのコンテンツを削除します。

@echo off
for /r %%d in (*) do call :process "%%d"
goto :eof

:process
pushd "%~dp1"
for /f "delims=" %%A in ('cd') do (
     set foldername=%%~nxA
    )
if "%foldername%"=="L3" del/q *.*
popd
goto :eof

簡単にすることも可能かもしれませんが、現在のディレクトリ名だけを取得するアクションは面倒です(プロセスセクションのforループ)

ディレクトリがこのように始まる場合

└───L1
    │   1.dat
    │
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    │           c.dat
    │           d.dat
    │
    ├───Bob
    │       6.dat
    │
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    │           a.dat
    │           b.dat
    │
    └───Ted
            6.dat

cleantreeを実行すると、次のようになります。

└───L1
    │   1.dat
    │
    ├───Alice
    │   │   9.dat
    │   │
    │   └───L3
    ├───Bob
    │       6.dat
    │
    ├───Carole
    │   │   2.dat
    │   │
    │   └───L3
    └───Ted
            6.dat
0
Prosaic Hacker
_for /f %G in ('dir /ad /b D:\L1\') do del D:\L1\%G\L3\*.txt
_

_for /f_は、セット内のすべてのファイルに対して次のdoコマンドを実行します

%G in ('dir /ad /b D:\L1\')変数は指定されたディレクトリ内の各フォルダのベアフォーマットとして設定されます

ディレクトリに%G値とワイルドカードを設定してコマンドを削除します


最初にテストを実行

echoを使用して実行し、実際に実行せずにコマンドをテストするために実行するコマンドをコンソールに出力します。

_for /f %G in ('dir /ad /b D:\L1\') do echo del D:\L1\%G\L3\*.txt
_
0
timtom