web-dev-qa-db-ja.com

ファイルを再帰的に削除するが、特定のファイルを除外するコマンドライン

コマンドラインを使用して、特定の種類のファイル(.Zipファイルなど)をフォルダーとそのすべてのサブフォルダーから削除する必要があります。理想的には、Windowsで.batファイルとして実行できるものを探しています。

DELコマンドがサブフォルダーを検索するための/ Sスイッチがあることは知っていますが、課題に追加するには、特定の名前のファイル(例として「Backup.Zip」)を除外する必要があります。

ファイルを再帰的に削除するが、特定の名前のファイルを除外する方法はありますか?私の状況では、削除したいすべてのファイル名を明示的にリストすることは実用的ではなく、削除したくない一致するタイプのファイルのみをリストします。

10
Tim C

良いトリック: 読み取り専用で除外したいファイル を作成してください!

DEL /Sは読み取り専用ファイルを削除しません。

次のスクリプトは、必要なことを正確に実行しません(以下の私のコメントを参照)が、削除を回避するために読み取り専用ファイルを使用する方法を示しています。

@ECHO OFF
:: This example supposes your first parameter is
:: the relative path to the folder to be deleted
:: and the second is the relative path (from the
:: the target folder) of the one to be excluded
:: Notice that this will only work if the folders
:: are in the working drive, if not, you ll
:: have to specify full paths

IF "%1"=="" GOTO ERROR
IF "%2"=="" GOTO ERROR
IF NOT EXIST %1\NUL GOTO ERROR
CD %1
IF NOT EXIST %2\NUL GOTO ERROR
ECHO Starting up the deletion process
ECHO. * Setting attributes
attrib %1\*.mp3 -r -s -h > NUL
attrib %2\*.mp3 +r > NUL
ECHO. * Deleting files
del /s %1\*.mp3
ECHO. * Reseting attributes
attrib %2\*.mp3 -r > NUL
ECHO.
ECHO Operation completed!
ECHO.
GOTO END

:ERROR
ECHO Parameters:
ECHO. Param1 -> target folder
ECHO. Param2 -> folder to be ignored
ECHO.
GOTO END

:END

注:サブフォルダーだけでなく、指定されたタイプのすべてのファイルを無視するために、このスクリプトを適合させることができます。

attrib /S *.xxx +r > NUL

事実上、現在のディレクトリとすべてのサブディレクトリのすべての「xxx」ファイルを除外するのに役立ちます(したがって、/Sオプション)。


注:「> NUL」の部分はリダイレクトであり、標準出力を表示する代わりに非表示にするためによく使用されます画面上で。
デバイスであるため、頻繁に使用すると(たとえば、さまざまなパスが関係する大きなループで)危険な場合があります。そして、すべてのデバイスと同様に(AUXCOMnLPTnNUL、およびPRN):

  • デバイスを開くと、1つのファイルハンドルが要求されます。ただし、ファイルとは異なり、デバイスは再起動するまで閉じられません。
  • 各デバイスはすべてのドライブのすべてのディレクトリに存在するため、たとえばC:\NULへのリダイレクトを使用し、その後C:\TEMPで再度使用すると、別のデバイスが失われます。ファイルハンドル。
8
VonC

次のように、ファイルのセットを簡単にループして、各ファイルに対してコマンドを実行できます。

set match=D:\blah\M*.Zip
for %%x in (%match%) do (
del %%x
)

次に、DOSで文字列を操作する方法に関するこの記事を読む必要があると思います: http://www.dostips.com/DtTipsStringManipulation.php

3
Magnus Smith

これを行うだけで簡単

  1. windowsボタン+ r
  2. cmdと入力し、Enterキーを押します
  3. 親ディレクトリに移動します。
    type c:またはd:(またはナビゲートするドライブの文字)
  4. dirと入力して、そのディレクトリの内容のリストを表示します(dir /ahと入力して隠しファイルを表示します)
  5. 次に、ディレクトリを変更するには、cd xxxx(xxxx =ディレクトリ名)と入力します。
  6. バッチ削除を実行するディレクトリに到達するまで、4と5を繰り返します。
  7. 次に、パターンを入力します。 del /S /ah *.jpgのようなものでEnterキーを押します。すべてのサブディレクトリを実行し、.jpgファイルであるすべての表示ファイルと非表示ファイルを削除します

*はワイルドカードです
/ Sすべてのサブフォルダーから削除
/ ah a =属性に基づいてファイルを選択、h =非表示

例: MacからWindowsにコピーするときに表示される迷惑な.DS_Storeファイルを削除するには、次のコマンドを実行します。

del /S /ah .DS_Store

または

del /S /ah ._*

これにより、MacからWindowsにコピーするときにも作成されるすべての「重複」隠しファイルが取得されます。

3
ucsarge

以下を使用するだけです。

forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"

TechNetリファレンスここにリンクの説明を入力してください

2

おそらく、「forfiles」コマンドが役立つ可能性があります

http://technet.Microsoft.com/en-us/library/cc753551.aspx

お役に立てば幸いです。

1
user61470

このスクリプトは、フォルダー(およびサブフォルダー)からすべての.Zipファイルを削除しますが、ファイル名に「backup」、「Backup」、「BACKUP」などの単語が含まれていない場合に限ります。

# Script DeleteZip.txt
var str folder, filelist, file
cd $folder
lf -r -n "*.Zip" > $filelist
while ($filelist <> "")
do
    Lex "1" $filelist > $file
    # Does this $file contain the Word "backup" ? Do case independent search (-c option).
    if ( { sen -c "^backup^" $file } <= 0 )
        system del ("\""+$file+"\"")
    endif
done

スクリプトはbiterscriptingです( http://www.biterscripting.com )。スクリプトをファイルC:/Scripts/DeleteZip.txtに保存します。次のようにスクリプトを実行します

script "C:/Scripts/DeleteZip.txt" folder("C:/testfolder")

すべてのレベルで、フォルダーC:/ testfolderとそのすべてのサブフォルダーに対して削除操作を実行します。

1
P M