2010-11-14 16 views
20

Mam pewien proces, który tworzy pliki o rozmiarze 0 KB w katalogu i jego podkatalogach.
Jak mogę usunąć pliki z systemu plików przy użyciu wiersza polecenia systemu Windows?
Każde polecenie lub skrypt, który wykona zadanie, będzie działać. Rekursywnie usuwaj pliki 0 KB przy użyciu okna cmd


Mogę uruchamiać tylko proste polecenia i skrypty cmd działające na zdalnym komputerze z ograniczonym dostępem.

+1

Jaka wersja systemu Windows? Wiele wersji systemu Windows zawiera VBScript, który może być bardziej elastyczny ... http://www.suite101.com/content/windows-scripting-command-line-vbscript-a83052 – Klinky

+0

Użyłbym 'for' do skanowania drzewa katalogów dla plików , 'findstr' do wyszukiwania plików dla"."deseń i usuń te niepasujące ... – Constantin

Odpowiedz

42
  1. Iterate rekurencyjnie na plikach:

    for /r %F in (*) 
    
  2. Sprawdzaj pliki o zerowej długości:

    if %~zF==0 
    
  3. Usuń je:

    del "%F" 
    

Kładzenie to wszystko razem:

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

Jeśli trzeba to w pliku wsadowym, to trzeba podwoić %:

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

Uwaga: byłem zakładając, że oznacza pliki o długości dokładnie 0 bajtów. Jeśli przy 0 KB masz na myśli mniej niż 1000 bajtów, to powyżej if musisz przeczytać if %~zF LSS 1000 lub jakikolwiek twój próg.

+0

hmm, który działał dzięki :) – crodjer

+1

(Dla kompletności) To samo polecenie wyłącza wyjście: http: // stackoverflow. com/a/18014912/2436175 – Antonio

+0

Użyj '@ if', jeśli chcesz pominąć drukowanie instrukcji if dla każdego pliku – Kip

-1

Możesz wypróbować find.exe od UnxUtils.

find . -type f -empty -delete 
+0

Nie jest to użyteczne do tego celu .... działa na zdalnym komputerze ... więc nie ma bezpośredniego dostępu .Może tylko uruchamiać polecenia i skrypty cmd – crodjer

+0

Myślę, że ta odpowiedź nie powinna być Nadal zapewnia użyteczne informacje, prawdopodobnie dla nieco innych kontekstów.Od głosowania, aby go zneutralizować – crodjer

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

można znaleźć w: link text wydaje się działać, z jednym zastrzeżeniem: To nie usunie plików z nazwami zawierającymi spacje. Może być jakieś obejście, ale obawiam się, że partia nie jest moją mocną stroną.

+0

No cóż, ponieważ jawnie deklarujesz przestrzeń jako ogranicznik tokenu' for' * będzie tokenizować. , 'del" %% a %% b "' powinno działać, ale rzeczywista odpowiedź brzmi, że nigdy nie powinieneś używać 'for/f' na wyjściu' dir', chyba że jest to absolutnie konieczne (np. do sortowania). 'sam może iterować ove r pliki i jest o wiele bardziej odporny w ten sposób. Na przykład twoje rozwiązanie nie będzie obsługiwać nazw plików zawierających znaki Unicode bez reprezentacji na stronie kodowej OEM, jeśli dla okna konsoli wybrano czcionki rastrowe. Te interakcje są subtelne, ale staram się trzymać z dala od 'for/f' dla nazw plików – Joey

0

Działa to poprawnie, gdy literówka jest poprawiona. Problem polegał na tym, że brakowało tyldy (~) np. Del "%% a" musi być del "%% ~ a"

To rzeczywiście usunie pliki z spacjami w nazwie, ponieważ zamyka token w "podwójnym cytaty”- metoda alternatywna byłoby użyć 'skróconą nazwę', jak pokazano w drugim przykładzie [%% ~ sa

@echo się sETLOCAL EnableDelayedExpansion o/f "znaków = * delims =" a w %% ('dir/a/b/a-d') do ( jeśli %% ~ Za urządze 0 del "%% ~ a" )

@echo się sETLOCAL EnableDelayedExpansion FOR/F "tokeny = * delims =" %% a W ('dir/s/b/a-d') zrobić ( jeśli %% ~ ZA EQU 0 del %% ~ sa )

Powiązane problemy