web-dev-qa-db-ja.com

Windows cmdを使用して0KBファイルを再帰的に削除する

ディレクトリとそのサブディレクトリに0KBサイズのファイルを作成するプロセスがあります。
windowsコマンドプロンプトを使用してファイルシステムからファイルを削除するにはどうすればよいですか?
タスクを実行する任意の単一のコマンドまたはスクリプトが機能します。


22
crodjer
  1. ファイルを再帰的に反復します。

    for /r %F in (*)
    
  2. 長さがゼロのファイルを見つける:

    if %~zF==0
    
  3. それらを削除します。

    del "%F"
    

すべてを一緒に入れて:

for /r %F in (*) do if %~zF==0 del "%F"

これがバッチファイルで必要な場合は、%を2倍にする必要があります。

for /r %%F in (*) do if %%~zF==0 del "%%F"

注:私は、長さが正確に0バイトのファイルを意味すると想定していました。 0 KBの場合、1000バイト未満を意味する場合、if以上はif %~zF LSS 1000またはしきい値が何であっても読み取る必要があります。

50
Joey
@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in ('dir/s/b/a-d') do (
if %%~Za equ 0 del "%%a"
)

次の場所にあります リンクテキスト は機能するようですが、1つの注意点があります。スペースを含む名前のファイルは削除されません。回避策があるかもしれませんが、バッチが私の得意ではないのではないかと思います。

2
Northover

これは、タイプミスが修正されたときに正常に機能します。問題はチルド(〜)の欠落でした。たとえば、del "%% a"はdel "%%〜a"である必要があります

これは、トークンを「二重引用符」で囲むため、名前にスペースが含まれているファイルを実際に削除します。別の方法は、2番目の例に示すように「短い名前」を使用することです[%%〜sa

@echo off setLocal EnableDelayedExpansion for/f "tokens = * delims =" %% a in( 'dir/s/b/a-d')do(if %%〜Za equ 0 del "%%〜a")

@echo off setLocal EnableDelayedExpansion for/f "tokens = * delims =" %% a in( 'dir/s/b/a-d')do(if %%〜Za equ 0 del %%〜sa)

0
Thom Spengler