chdir
Dizine girerseniz ve sadece göreli yolları kullanıyorsanız uzun yol adlarına ihtiyacınız yoktur rmdir
.
Ya da yüklü bir POSIX kabuğunuz varsa ya da bunu DOS muadiline bağladığınızda:
# untested code, didn't bother actually testing since the OP already solved the problem.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # repeat more times to work in larger batches
rm -r Folder1 # remove the first several levels remaining after moving the main tree out
# then repeat to end up with the remaining big tree under the original name
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(Döngü koşulu olarak yeniden adlandırdığınız yeri izlemek için bir kabuk değişkeni kullanmak, orada yaptığım gibi döngüyü açmanın diğer alternatifidir.)
Bu, işletim sistemini n
yeni bir seviye eklendiğinde her seferinde ağacı yukarıdan yukarı seviyeye geçmeye zorlayan ve izinleri kontrol eden vb . İşlem yapan KenD'in çözümünün CPU ek yükünden kaçınır sum(1, n) = n * (n-1) / 2 = O(n^2)
. Zincirin başından itibaren bir yığıntan ayrılan çözümler, O(n)
Windows'un üst dizinini yeniden adlandırırken bir ağaçtan geçiş yapması gerekmediği sürece olmalıdır . (Linux / Unix yapmaz.) chdir
Ağacın dibine kadar tüm yolların ve oradan göreceli yolları kullanan çözümler, dizinleri chdir
yedekledikçe kaldırarak O(n)
, işletim sisteminin tüm denetlemenizi kontrol etmesi gerekmediğini düşünerek CD'leri bir yere yazarken bir şeyler yaptığınızda her sistem üst dizinini çağırır.
find Folder1 -depth -execdir rmdir {} +
rmdir'i çalıştırırken en derin dizine CD yazacak. Veya aslında, find'in -delete
seçeneği dizinlerde çalışır ve ima eder -depth
. Öyleyse find Folder1 -delete
aynı şeyi yapmalı, ama daha hızlı. Evet, GNU Linux'ta bir dizini tarayarak, göreceli yollarla alt dizinlere, sonra rmdir
da göreceli yolla CD'leri bularak bulur chdir("..")
. Yükselirken dizinleri yeniden taramaz, bu yüzden O(n)
RAM tüketir .
: Bu gerçekten bir yaklaşım oldu strace
o ASLINDA kullandığı gösterileri unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
ve fchdir(the fd from opening the directory)
bir grup ile, fstat
çok karışık çağrılar. Ancak, dizin çalışırken ağaç çalışırken değiştirilmiyorsa, efekt aynıdır.
düzenleme: Sadece başladı, bunu GNU / Linux'ta denedim (Ubuntu 14.10, 2.4GHz birinci nesil Core2Duo CPU'da, WD 2.5TB Yeşil Güç sürücüsündeki (WD25EZRS) bir XFS dosya sisteminde).
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
real 0m1.141s
user 0m0.005s
sys 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lines / 2k words / 38M characters of text
ll -R annoyingfoldername
... eventually
ls: cannot access ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername: File name too long
total 0
?????????? ? ? ? ? ? annoyingfoldername
time find annoyingfoldername -delete
real 0m0.054s
user 0m0.004s
sys 0m0.049s
# about the same for normal rm -r,
# which also didn't fail due to long path names
(mkdir -p, bir dizin ve eksik yol bileşenleri oluşturur).
Evet, 2k rmdir ops için gerçekten 0.05 saniye. xfs, meta veri işlemlerinin 10 yıl önceki gibi yavaş olmalarını sağladığı için dergide meta veri işlemlerini bir araya getirmede oldukça iyidir.
Ext4'te create 0m0.279s aldı, find ile sil hala 0m0.074s aldı.
/MIR
yerine denerdim :ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
aynı zamandachkdsk
sadece kıkırdamalar için koşmaya değer olabilir .