it-swarm.asia

Windows'ta toplu silme dosyaları

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 hızlı şekilde yapmanın başka bir yolu var mı?

138
aaginor

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 rmdir /s/q C:\stufftodelete dosyasına taşırım. 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 960 dosya örneğinin Hızlı Zamanlı 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 geçişe ve her bir singe dosyası için ekrana yazma ek yükünü önlemek için geçersiz sayıları çıkarır. Sonra ikinci bir geçiş kalan dizin yapısını temizler:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Metot 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 tekrar test ettim, bu benim için tipik bir durumdur: 146.918 klasördeki 28.3 GB 1.159.211 dosya:

  • Yöntem 1: 2saat 15m, 2saat 34m: ortalama: 2 saat 25 dakika
  • Metot 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!

177
Hugo

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. Bunun hakkında blog yazdım here .

18
Mr. Bungle

İstemi komutunda (Başlat -> Çalıştır -> cmd):

del /f /s /q foldername 
9
lmsasu

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 onu kullanmak için el ile zorlamanız gerekir.

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

6
rautamiekka

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 olarak 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İ!

6
magallanes

Prompt komutundan rd/s komutunu kullanın.

3
JP Alioto

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
3
Benoit

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 gereği olduğundan eminim.

2
Ryan Thompson

Cygwin programını kullanın ve rm -r komutunu kullanın. Ama bu fazlaca bilinir.

1
CarlF

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.

1
MSalters

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
Stephen Kellett

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ü Aygıtı ve Modeli
    • Tercihen, ATTO/Kristal Disk, verileri klonlamadan önce kıyaslanır.
  • Aynı Bölme/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 klonlamaktı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 kesin 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
  • Çıkış Günlük dosyalarını gönderirdim, ancak klasör dosyalarının boyutları ve dağılımı vb. 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
0
Alex S

Hugo 'dan gelen cevap en hızlıdır 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 BAT dosyası hakkında, alınan ve icacls ile çok dikkatli olun, hardlinks aynı izinleri ve sahipleri paylaşmasına neden olur, bu nedenle doymamış hardlinks varsa kaldırmak istediğiniz klasörde, takeown ve icacls kullanarak Klasör dışındaki dosyaların izinlerini ve sahiplerini değiştirir.

ln.exe aracını kullanarak, klasörün içine bağlanmış tüm dosyaları listeleyebilir ve klasörün dışındaki dosyalara bağlanıp bağlanmadıklarını (doymamış sabit bağlantılar) öğrenebilirsiniz:

ln.exe --enum foldername > HardlinksList.txt
0
liamZ