Windows'ta toplu silme dosyaları


141

Bir Windows 2008 sunucusundaki belirli alt dizinlerde ~ 3 milyon dosya içeren bir dizin var. Dosyaları kök dizinde ÜST KRKT + DEL ile manuel olarak silmek yıllar alır. Silme işlemini daha hızlı yapmanın başka bir yolu var mı ?


1
Ayrıca burada Stack Overflow'ta sordum: stackoverflow.com/questions/186737/…
Hugo

6
Mıknatısı yalnızca bazı alt dizinlere nasıl hedefleyebilirim?
Jaime Hablutzel

7
@Jaime Sağlam bir el ile, gerçek bir programcı gibi ... ;-) xkcd.com/378
Legionair

Ya bir SSD Sürücüsü ise?
Benjamin Weiss,

Yanıtlar:


179

UYARI: Dizinlere sembolik bağlantılarınız varsa, geçerli dizinleri delsiler , linkleri silemez. Bu konuda çok dikkatli olun ve hedef dizinde hiçbir sembolik bağlantı olmadığını bilmiyorsanız bu komutları çalıştırmayın.


WinXP şifreli bir sürücüden, genellikle 45.000 klasörde yaklaşık 22 GB 500.000 dosyadan oluşan çok sayıda dosyayı ve klasörü silmem gerekiyor.

Windows Gezgini ile silmek, dosyaları numaralandırmak için çok zaman harcıyor çünkü çöp. Genellikle silmem gerekenleri C: \ stufftodelete dizinine taşır ve bir deletestuff.bat toplu iş dosyasına alırım rmdir /s/q C:\stufftodelete. Bu gece çalıştırmak planlanıyor, ama bazen gün boyunca çalıştırmak gerekir, bu yüzden daha hızlı daha iyi.

İşte 303 klasördeki 5.60 MB'lık küçük 960 dosya örneğinin hızlı bir zaman testinin sonuçları. Yöntem 1'i ve ardından yöntem 2'yi çalıştırdım, ardından test dizinlerini sıfırladım.

Yöntem 1, dosyaları ve dizin yapısını bir geçişte kaldırır:

rmdir /s/q foldername

Metot 2, dosyaları silmek için ilk pasa sahiptir ve her singe dosyası için ekrana yazma ek yükünü önlemek için geçersiz sayılır. Sonra ikinci bir geçiş kalan dizin yapısını temizler:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Yöntem 1: 17.5, 14.9, 13.9, 14.8, 13.8, ortalama: 14.98 saniye
  • Metot 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: ortalama 12.82 saniye

İşte 3,243 klasörde 404 MB 19,521 dosya kullanan başka bir testin sonuçları:

  • Yöntem 1: 2 dakika 20 saniye
  • Yöntem 2: 2 dakika 33 saniye

Yani içinde çok fazla bir şey yok, muhtemelen tek bir testte yargılamak için çok yakın.


Düzenleme: Çok daha fazla veri ile yeniden test ettim, bu benim için tipik bir durumdur: 146.918 klasördeki 28.3 GB 1.159.211 dosya:

  • Yöntem 1: 2 saat 15m, 2 saat 34m: ortalama: 2 saat 25 dakika
  • Yöntem 2: 49m, 57m: ortalama: 53 dakika

Vay, yöntem 2, yöntem 1'den neredeyse üç kat daha hızlı! Deletestuff.bat'imi güncelliyor olacağım!


Mutlak bir yol belirtirseniz RD / S / Q harika çalışır ancak göreceli yollarla çalışırken çalışmaz. Bir çözüm var mı?
Michael S.

1
@Hugo: Hugo, bir soru: Yukarıdaki zamanlanmış testlerde, yöntemlerden herhangi birini ya da her ikisini de, yöntemi çalıştırmadan hemen önce dosyaları saydınız mı? Klasör içeriği zaten işletim sistemi önbelleğinde olabileceğinden soruyorum. Teşekkürler!
William,

@WilliamC: Tam olarak hatırlamıyorum, ancak aynı içeriğe sahip tekrarlanan silme işlemleri için yalnızca bir silmeden hemen önce saymış olacağım ve diğer silme işlemleri için tekrarlamayacağım (sayıları zaten bildiğim gibi).
Hugo,

1
256 karakterden daha uzun yol adları olduğunda, hem rmdir hem de del başarısız olur.
Nicolai Ehemann,

1
UYARI: Dizinlere sembolik bağlantılarınız varsa, geçerli dizinleri delsiler , linkleri silemez. Bu konuda çok dikkatli olun ve hedef dizinde hiçbir sembolik bağlantı olmadığını bilmiyorsanız bu komutları çalıştırmayın.
user0103

18

Büyük dizin ağaçlarını düzenli olarak silmeniz gerekiyorsa, bu dizin ağacının kökünü ayrı bir bölüme kaydetmeyi düşünün, ardından her şeyi silmeniz gerektiğinde hızlıca biçimlendirin. Bunu otomatikleştirmeniz gerekirse, bu DOS komutunu kullanabilirsiniz:

echo Y | format Z: /FS:NTFS /X /Q

Z: 'uçucu' bölümünüz. Not: Bölümün etiketi olmamalıdır. Bu konuda blogged burada .


Tam dizin yolu gerekirse, dosyaların depolandığı disk ile dizin arasında bağlantı oluşturmak için bir bağlantı kullanın.
Nime Cloud

1
@NimeCloud: Sabit bağlantılar dosya sistemlerini veya bağlantı dizinlerini geçemez.
saat

5
Ancak, sembolik bağlantılar olabilir dosya sistemlerini çapraz ve dizinleri bağlantı, bu yüzden burada uygun olabilir. Mklink komutuna bakın (Vista ve üstü; aksi takdirde Mark Russinovich / SysInternals ile bir bağlantı kullanın.)
Robert Calhoun

9

Komut isteminde (Başlat -> Çalıştır -> cmd):

del /f /s /q foldername 

Bu harika çünkü ne sildiğini listeliyor .. ama hız açısından rd ile aynı.
bobobobo

1
Vay vay vay vay vay. Düşündüğüm kadar iyi değil. Dosyaları hızlı bir şekilde siler ancak dizin ağacını sağlam bırakır.
bobobobo

1
Hangi ekleyebilirim rd kullanarak temizlemek için uzun zaman alıyor.
bobobobo

3
@bobobobo ~ 30GB / 1.000.000 dosya / 15.000 klasörle bazı testler yaptım ve del + rd sadece rd'den neredeyse üç kat daha hızlı: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo

1
Yol adı 256 karakterden uzunsa bu başarısız olur.
Nicolai Ehemann,

7

Dosyaları çok hızlı bir şekilde kopyalamaya / taşımaya ek olarak (kendi API'sini kullanarak), TeraCopy dosyaları silebilir ve çok hızlıdır. TeraCopy'yi keşfettiğimden beri, yüklü olmayan bir bilgisayar kullanmıyorum (eğer kopyalayacağım / taşıyacağım / sileceğim).

Aynı yükleyici x64 sürümünü yükler ancak kullanmak için el ile zorla uygulamanız gerekir.

Kararlı sürümlerde önerdiğim beta: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


Daha önce hiç TeraCopy vs rmdir veya del veya del + rmdir benzeri karşılaştırmaları yaptınız veya gördünüz mü?
Hugo

1
@ Hugo: Aptal bir soru. Düz gözle görülemiyorsa TeraCopy'yi tavsiye etmem daha hızlıdır!
rautamiekka

5
Yani% 10 daha hızlı olduğunu tahmin ediyor musunuz? En az iki kere mi? 10 kat daha hızlı mı? Milyon kat daha hızlı mı? İki büyük ve özdeş test seti ile rmdir'e karşı zaman ayırabilirseniz çok iyi olur.
Hugo

1
Teşekkür ederim! Yıllardır TeraCopy kullanıyorum, ancak kitle silme işlevini asla bilmiyordum. Ve haklısın, çok, çok daha hızlı!
AzDayton

1
@Amalgovinus Yapmazsınız. Programı açıp sürükleyip bırakarak veya sağ tıklatarak dosya / klasör ekleyebilir veya Explorer / masaüstündeki dosya / klasörleri sağ tıklayabilirsiniz. Onları yürümek bittiğinde, sadece 'Sil' ve 'Geri Dönüşüm Kutusu'na Taşı'yı tıklayın, ancak' Diskten Sil'i tercih ediyorum. Bununla birlikte, eğer varsayılan olarak yapılmadıysa, masaüstünde / Explorer'da sağ tıklamayı göstermek için TeraCopy'yi Yönetici olarak başlatmanız gerekir.
rautamiekka

6

Aynısını yapan bir yarasa dosyası yaptım.

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

iki adımda işi yapar, bir, dosyaları silmeye çalışır. İkincisi ise dosyaların sahipliğini almaya çalışmak. y yerel bölgenize göre değiştirilmelidir (ingilizce için evet anlamına gelir). Eğer görev başarısız olursa (örneğin izin verildiği için başarısız olursa) tekrar çalıştırmanız gerekir. Ancak, ikinci raunt, ilk rauntta silinen dosyaları silmeyi deneyemez, bu yüzden oldukça hızlı olabilir.


Bu nasıl kullanılır. Delfolder.bat olarak bir yol güzergahına kaydedin (örneğin, c: \ windows), sonra çalıştırın.

 delfolder "foldername"   

burada foldername klasörün adıdır.

Testimde 123.000 dosya silmek 3 dakika sürdü (sata 7200 rpm). YUPPİ!


1
Genellikle %1bir komut dosyasında kullanmamalısınız , ama "%~1". Bu şekilde, eğer argüman tırnak işaretleri arasında geçtiyse, kodu kaldırılır ve istenir. Tırnak işaretleri ile geçmediyse, kote edilir.
Benoit

4

Aşağıdaki kodu kullanmak genellikle benim için işe yarar.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe

Bu robokopi çağrısının sonuna bir '> boş' ekleyin, böylece ekranda görmek zorunda kalmazsınız.
JoshDM

rsyncLinux kullanımına benzer . O zaman daha hızlı burada rmdirmı?
Hastur

Bilginize, bu robokopi del /f/q/s+ dan çok farklı rmdir /s/q. Eğer dir_to_wipe cihazınız size önemsiz ise c:\some_important_dir, verilerinizi kaybedersiniz.
Pavel P

@Pavel sonra bağlantı noktalarını ve sembolik bağları dışlamak için / XJ kullanın.
Bernhard

Bu, del / rmdir "yönteminin" başarısız olmasına neden olan,> 256 karakterden oluşan yüzlerce dizin ve dosya içeren ~ 36GB'lık bir dizinin hilesini yaptı. Bu birkaç saniye sürdü, Windows Gezgini HOURS!

3

Komut isteminden rd / s komutunu kullanın .


2
Hayır. Bu, tarayıcıdan silmek kadar yavaş.
bobobobo

Peki, tamam. Zaten del / f / s / q'dan daha iyi çalışıyor.
bobobobo

3
Aslında, bu aslında silmek için Explorer kullanmaktan daha iyidir. Bir veya iki silme işlemi başarısız olsa bile, silme işlemine devam eder (explorer
boğulur

2

En iyi pratik çözüm muhtemelen klasörü bir yerden (örneğin Geri Dönüşüm Kutusu) uzaklaştırarak silmeye başlamaktır. Yaş alacak, ama en azından yolun dışında olacak.

Tüm bu dosyaları silmek için gereken zamanın, silme uygulamasındaki bir verimsizlik değil görevin doğal bir gereksinimi olduğundan eminim.


1

Cygwin'i kurun ve rm -r kullanın . Ama bu fazlaca bilinir.


Bu tamamen aynı rd /q /s...
Joey

Çok fazla görev ve neredeyse eşdeğer hız!
adeelx

1
Buradaki diğer birçok takma araç-X-ve-kullan-yaz uygulamasının cevap vermesinden daha kötü bir şey değil ve olmadıklarında oy kullanmamalılar.
JdeBP

2
Cygwin rmgerçekten cmd.exe yerleşik kadar hızlı rdmı? Posix arabiriminin cygwin öykünmesi, bazı ekstra işler yapmayı gerektirdiğinden oldukça yavaştır çünkü bu rmaslında takdir etmez.
Jan Hudec

Büyük bir dosya koleksiyonunun silinmesini beklerken Cygwin'i kurmak ve denemek için yeterli zamanım oldu rm -rf. Yaklaşık 10 dakika sonra iptal edip geri döndüm del /f/s/qçünkü Cygwin'de disk kullanımı sadece% 50 idi. Altında deldisk kullanımı% 100 olarak sabitlenmiştir. Bu yüzden daha hızlı silme gerektiğini düşünüyorum. Her iki yöntem için de CPU kullanımı <% 1'dir. Dosya numarasından emin değilim çünkü hesaplamayı 10 dakika harcadıktan sonra Windows Dosya Silgisini kapattım.
Derek Ziemba

1

Kısa dosya adı oluşturma etkin mi? Eğer öyleyse, gerçekten ihtiyacınız var mı? Bir dosyayı kaldırmak yalnızca bir meta veri seçeneğidir. Bu nedenle, kaldırılacak adların iki katı adınız varsa, çalışma miktarı önemli ölçüde artar.


0

Bu iki uygulamadan birini denediniz mi?

En hızlı performansı istiyorsanız, üzerine yazma sayısını 0 olarak ayarladığınızdan emin olun. Bunu, seçenekleri tıklatarak ve ardından iletişim kutusunun altındaki değeri değiştirerek yapın.

Kaynak alanına silinecek yolu girin ve ardından Sil düğmesine tıklayın.

Bu uygulamalar dosyaları geri dönüşüm kutusuna atmaz. Dikkatli kullanın.


0

Bu, daha önce belirtilen cevaplarda atılan adımları iltifat ve büyütmek için sağlanmıştır.

Yukarıda verilen iki yöntem oldukça etkili görünmektedir, ancak performansları belirlemek, aynı koşullara tam olarak uymadıkça zor olacaktır:

  • Fiziksel Sabit Sürücü Cihazı ve Modeli
    • Tercihen, ATTO / Kristal Disk, verileri klonlamadan önce kıyaslanır.
  • Aynı Bölüm / Cilt Konum ve Geometri
    • Bunu yapmanın yolu, örnek bölüm / klasörleri birleştirmek ve tam olarak aynı tip 2 Sabit Sürücü olduğu gibi onları kopyalamak olacaktır (önceki adımdan itibaren)
  • Sonra yapılandırmaları Toplu İş Dosyası üzerinden yürütün ve performanslarını kaydetmek ve ölçmek için Powershell Cmdlet'i kullanın.

    • İdeal olarak, benzer aktivitenin tekrarlanmasından dolayı önbellekleme önyargısını önlemek için bazı mekanizmalar ekleyin.
  • Aşağıdakiler, üzerinde denediğim ancak net bir performans / sonuç alamadığım bazı örnek klasörlerdir (toplam boyut olarak adlandırılmıştır).

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Çıktı Günlüğü dosyalarını yayınlardım, ancak klasör dosyalarının boyutları ve dağılımı vs. nedeniyle varyansın çok büyük olduğuna inanıyorum.

Güç kalkanı:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt

> 256 karakterden oluşan adlarla başarısız olur

0

Hugo'nun cevabı en hızlı ancak ilk geçişte gizli veya sistem dosyalarını silmez, bu nedenle daha eksiksiz bir çözüm istiyorsanız / a parametresini kullanın:

del /f /s /q /a foldername > nul
rmdir /s /q foldername

Magallanes tarafından yazılan BAT dosyası hakkında, takılan ve icacls ile çok dikkatli olun, hardlinks aynı izinleri ve sahiplerini paylaşmasına neden olur; bu nedenle , kaldırmak istediğiniz klasörde doymamış hardlinks varsa , alınan ve icacl'leri kullanmak dışında kalan dosyaların izinlerini ve sahiplerini değiştirir dosya.

Ln.exe aracını kullanarak klasörün içine bağlanmış tüm dosyaları listeleyebilir ve klasörün dışındaki dosyalara bağlanmış olup olmadıklarını bilir (doymamış sabit bağlantılar):

ln.exe --enum foldername > HardlinksList.txt

-1

Klasörü silmek, birden çok dosyayı silmektan daha hızlıdır.

Bu nedenle, komut istemi yerine fare kullanmayı tercih ederseniz, dizin oluşturabilir, dosyaları oraya taşıyabilir ve silebilirsiniz (dediğiniz gibi Shift + Del ile).


2
Dizin, dosyaların bulunduğu bölümde oluşturulmalıdır. Bu hareket eylemi anında yapacaktır. Yeni klasör ve dosyalar ayrı bölümlerde ise, tüm kopyalama işlemi çok uzun sürecektir.

5
Bir klasörü silmenin içindeki dosyaları silmekten daha hızlı olduğunu nereden biliyorsunuz? Bir klasörü silmek , o klasördeki tüm dosyaları silmek için ilk adımı içeriyor , bu nedenle daha hızlı olamaz. Geri dönüşüm kutusuna gitmek tamamen farklı bir konudur, ancak buradaki sorun bu değil.
Joey,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.