バッチファイルを使用して、特定のタイプ(拡張子)のすべてのファイルをディレクトリから再帰的に削除します


84

dir1とdir2のすべての.jpgファイルと.txtファイル(たとえば)を削除する必要があります。

私が試したのは:

@echo off
FOR %%p IN (C:\testFolder D:\testFolder) DO FOR %%t IN (*.jpg *.txt) DO del /s %%p\%%t

一部のディレクトリでは機能しました。他ではそうではありませんでした。

たとえば、これは何もしませんでした:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

2番目のスニペットで何が欠けていますか?なぜうまくいかなかったのですか?


それがどの程度正確に「機能しなかった」かについての詳細情報を提供していただければ助かります。実際の結果は期待される結果とどのように異なりますか?エラーメッセージが表示されますか?どっち?
Ansgar Wiechers 2012年

回答:


202

delコマンドでワイルドカードを使用/Sして、再帰的に実行できます。

del /S *.jpg

補遺

@BmyGuestは、反対票を投じた回答(del /s c:\*.blaawbg)が私の回答と異なる理由を尋ねました。

あります巨大な実行しているとの違いdel /S *.jpgとはdel /S C:\*.jpg。最初のコマンドは現在の場所から実行されますが、2番目のコマンドはドライブ全体で実行さます。

jpg2番目のコマンドを使用してファイルを削除するシナリオでは、一部のアプリケーションが機能しなくなり、家族の写真がすべて失われる可能性があります。これは非常に煩わしいことですが、コンピュータは引き続き実行できます。

ただし、あるプロジェクトで作業していて、dll内のすべてのファイルを削除したい場合はmyProject\dll、次のバッチファイルを実行します。

@echo off

REM This short script will only remove dlls from my project... or will it?

cd \myProject\dll
del /S /Q C:\*.dll

次にdllC:\ドライブからすべてのファイルを削除することになります。すべてのアプリケーションが機能しなくなり、コンピューターが役に立たなくなり、次の再起動時に4次元にテレポートされ、永遠に立ち往生します。

ここでの教訓は、%windir%回避できる場合は、ドライブのルートで(または、などの危険な可能性のある他の場所で)そのようなコマンドを直接実行しないことです。常に可能な限りローカルで実行してください。


3
pause最後に行を追加する と、ユーザーは完全なログ情報を表示できます。
KNU 2015

2
補遺をありがとう、ラフ。他の人がこの本当に重要な違いを見つけるのに役立つと思います。
BmyGuest 2016年

誰もが特定のディレクトリから削除したい場合は、組み合わせることができますcdし、del`&」を参照してコマンドstackoverflow.com/q/8055371/7429464を
FindOutIslamNow

@FindOutIslamNowまたはdel、現在のディレクトリを変更せずに、コマンドでフルパスを指定できます。
ラフ2018年

これに対する小さな警告-削除するファイルが見つからない場合はエラーが発生します。
ジェイミーマーシャル

4

削除するファイル拡張子を選択できるバッチスクリプトを少し前に作成しました。スクリプトは、それが含まれているフォルダーとすべてのサブフォルダーで、その拡張子を持つファイルを探して削除します。

@ECHO OFF
CLS

SET found=0
ECHO Enter the file extension you want to delete...
SET /p ext="> "

IF EXIST *.%ext% (           rem Check if there are any in the current folder :)
  DEL *.%ext%
  SET found=1
)
FOR /D /R %%G IN ("*") DO (  rem Iterate through all subfolders
  IF EXIST %%G CD %%G
  IF EXIST *.%ext% (
    DEL *.%ext%
    SET found=1
  )
)

IF %found%==1 (
  ECHO.
  ECHO Deleted all .%ext% files.
  ECHO.
) ELSE (
  ECHO.
  ECHO There were no .%ext% files.
  ECHO Nothing has been deleted.
  ECHO.
)

PAUSE
EXIT

これが欲しい人に役立つことを願っています:)


または、Bashがインストールされている場合(Cygwin、WSLなど)、単純なものfind . -name "*.ext" -type f -delete(extは選択した拡張機能)で十分です。
パイログリフ

3

これを使用して、フォルダおよびサブフォルダ内のすべてのファイルを削除できます。

DEL "C:\Folder\*.*" /S /Q

または、これを使用して特定のファイルタイプのみを削除します。

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 

0

コメントを追加するのに十分な評判がないので、これを回答として投稿しました。ただし、このコマンドの元の問題の場合:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

最初のForには再帰構文がないため、次のようになります。

@echo off
FOR /R %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

あなたはただすることができます:

FOR %%p IN (C:\Users\0300092544\Downloads\Ces_Sce_600) DO @ECHO %%p

実際の出力を表示します。


0

これです:

@echo off

:: del_ext
call :del_ext "*.txt"
call :del_ext "*.png"
call :del_ext "*.jpg"

:: funcion del_ext
@echo off
pause
goto:eof
:del_ext
 set del_ext=%1
 del /f /q "folder_path\%del_ext%"
goto:eof

pd:folder_pathを自分のフォルダーに置き換えます


-11

C:ドライブで特定の.extensionsを削除しようとしている場合は、次のcmdを使用します。

del /s c:\*.blaawbg

暗号化ウイルスに感染した顧客がいて、すべてのジャンクファイルを見つけて削除する必要がありました。


13
これは恐ろしく危険なようです。
dudewad 2015

5
この回答(-2票)と承認された回答(+42票)の主な違いは何ですか?
BmyGuest 2016

6
@BmyGuest主な違いは、サブフォルダーのどこかでコマンドを実行すると、このサブフォルダーの下にあるファイルにのみ影響することです。この回答では、ドライブ全体のファイル名に一致するものすべて削除します。したがって、プロジェクト内のいくつかのdllファイルを削除したいときに、誤ってと入力したdel /s c:\*.dll場合は、非常に悪い驚きがあります。どうしても必要な場合を除いて、ドライブ全体でこのようなコマンドを実行しないでください
Laf 2016年

2
この答えはそれほど多くの反対票に値するとは思わない。答えは、このコマンドがドライブ全体(およびその理由)を対象としていることを説明しています。c:ドライブ全体が必要ない場合は、目的のフォルダに置き換える必要があります。
user1527152 2018

2
免責事項やすべきでないことの警告として機能するのと同じくらい多くの反対票が必要だと思います。このようなコードをコピー、貼り付け、実行することで、本当に物事を台無しにすることができます。この正確なレッスンを「安全な」方法で教えるために、bashに組み込まれているイースターエッグがたくさんあります。この例はあなたの一日を台無しにする可能性があります。ベスト!
jacktrader
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.