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ı ?
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ı ?
Yanıtlar:
UYARI: Dizinlere sembolik bağlantılarınız varsa, geçerli dizinleri del
siler , 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
İşte 3,243 klasörde 404 MB 19,521 dosya kullanan başka bir testin sonuçları:
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:
Vay, yöntem 2, yöntem 1'den neredeyse üç kat daha hızlı! Deletestuff.bat'imi güncelliyor olacağım!
del
siler , 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.
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 .
Komut isteminde (Başlat -> Çalıştır -> cmd
):
del /f /s /q foldername
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/
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
bir 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.
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
rsync
Linux kullanımına benzer . O zaman daha hızlı burada rmdir
mı?
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.
Komut isteminden rd / s komutunu kullanın .
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.
Cygwin'i kurun ve rm -r kullanın . Ama bu fazlaca bilinir.
rd /q /s
...
rm
gerçekten cmd.exe yerleşik kadar hızlı rd
mı? Posix arabiriminin cygwin öykünmesi, bazı ekstra işler yapmayı gerektirdiğinden oldukça yavaştır çünkü bu rm
aslında takdir etmez.
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 del
disk 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.
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.
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:
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.
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
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
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
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).