Oldukça iç içe geçmiş bir klasörü nasıl silebilirim ve “Dosya adı çok uzun” olmamasını nasıl önleyebilirim?


70

Eclipse, oldukça derin bir şekilde yerleştirilmiş dizinlerden birinde geçici bir klasör oluşturdu;

dir1\dir1\dir1\dir1\...

Bu klasörü Windows'ta Explorer, delveya rmdirkomutları veya Cygwin 'rm' komutu ile silemiyorum . Bu çok uzun klasörü nasıl kaldırmalıyım?

Sadece "Dosya adı çok uzun ..." demeye devam ediyor.


Yanıtlar:


105

Eğer benim gibiyseniz ve böyle bir sorunu çözmek için ek bir yazılım yüklemekten hoşlanmıyorsanız, XQYZ'in önerisiyle gider robocopyve sorunu çözmek için kullanırım . (Benim durumumda sorun, ilk başta robokopi ile, içinde tekrarlayan bağlantı noktaları olan bir dizini kopyalayarak / robokopiye XJ vermeden yaratıldı).

C: \ subdir \ more \ offending_dir konumunda başlayan dizin ağacını silmek için :

Toplam adım adım işlem bu kadar basittir:

  1. cd c:\subdir\more üst dizine cd.
  2. mkdir empty boş bir dizin oluşturmak için.
  3. robocopy empty offending_dir /mir Boş dizini rahatsız edici dizine yansıtmak için.
  4. Biraz bekledikten sonra bitti! Şununla bitirin:
  5. rmdir offending_dir şimdiki boş suçlu rehberinden kurtulmak için ve
  6. rmdir empty ara boş dizininizden kurtulmak için.

2
Mükemmel öneri. Benim sorunum aynı zamanda robocopy tarafından yaratıldı ve robocopy fikrini tarif ettiğiniz gibi benim için çalıştı.
Nathan Garabedian

3
Ayrıca robocopybirleşme noktaları ve kavşak noktaları yaptım ; bana pisliği temizlemek için nasıl kullanılacağını gösterdiğin için teşekkürler!
Sayın Sihirbaz

klasörlerim robocopy tarafından yaratılmadı, fakat onları tamamen kaldırdı
Sasha

11
Düğüm paket yöneticisi (NPM) bu soruna benim için neden oldu. Nedense çok fazla iç içe geçmiş paket vardı.
David Sherret

Bu açıkça en iyi ve en makul cevaptır, ısmarlama özyinelemeli toplu komut dosyasından çok daha iyi
monastic-panic

39

Bu aslında düzeltmek için oldukça basittir. Dizin yapısının şöyle olduğunu söyleyin:

C:\Dir1\Dir1\Dir1\Dir1…

Bunu düzeltmek için, her klasörü silmek için artık çok uzun olmayana kadar bir karakterli bir klasör adına yeniden adlandırın:

  1. yeniden adlandırma C:\Dir1içinC:\D
  2. Şu yöne rotayı ayarla C:\D\
  3. yeniden adlandırma C:\D\Dir1içinC:\D\D
  4. Şu yöne rotayı ayarla C:\D\D\
  5. Toplam yol uzunluğu <260 olana kadar Goto 1

İşte işlemi otomatikleştirmek için bir toplu iş dosyası (bu basit sürüm, özellikle tek kullanımlık olanlar için, soruda açıklananlar gibi basit dizinler için en iyisidir). (Örneğin olası o en yüksek klasörü iletin C:\Dir1için C:\Dir1\Dir1\Dir1…veya C:\Users\Bob\Desktop\New Folderiçin C:\Users\Bob\Desktop\New Folder\abcdefghi…)

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

Teknik Açıklama

Önerilen diğer çözümler geriye doğru; En içteki dizinden dışa doğru çalışarak düzeltemezsiniz, diğer yöne gitmeniz gerekir.

Bir dizine erişmeye çalıştığınızda, açıkça veya olmasın, bundan önce gelen her şeyi içeren mutlak yolunu kullanırsınız. Bu nedenle, gibi bir dizin yapısı C:\Dir1\Dir1\Dir1\Dir1için, en içteki yolun uzunluğu Dir122'dir. Ancak, en dıştaki yolun uzunluğu Dir1sadece 7'dir ve bu nedenle, içeriğinden bağımsız olarak (belirli bir yönetmenin yolu bağlamında) hala erişilebilir durumdadır. dosya sistemi ne içerdiğini veya alt dizinlerinin toplam yol uzunluğu üzerindeki etkisini bilmiyor; yalnızca dizin dizinleri - toplam yol uzunluğu çok uzunsa bir dizini yeniden adlandıramazsınız).

Bu nedenle, çok uzun bir yolla karşılaştığınızda yapmanız gereken, mümkün olan en yüksek seviyeye gitmek ve onu tek karakterli bir adla yeniden adlandırmak ve buradaki her seviye için tekrarlamaktır. Bunu her yaptığınızda, yolun toplam uzunluğu eski ad ile yeni ad arasındaki farkla kısalır.

Bunun tersi de geçerlidir. Desteklenen maksimum uzunluktan daha büyük bir yol oluşturamazsınız (DOS ve Windows'ta MAX_PATH = 260). Ancak, en içten dışa doğru çalışan dizinleri daha uzun bir adla yeniden adlandırabilirsiniz. Sonuç, mutlak yolu> 260 olan daha derin klasörlere erişilemez olmasıdır. (Bu onları “gizli” ya da güvenli kılmaz, çünkü elde edilebilecek kadar basitler, bu nedenle dosyaları gizlemek için bu yöntemi kullanmayın.)


İlginç Yan Not

Windows 7 Explorer'da klasörler oluşturursanız, Explorer, toplam uzunluktan daha uzun MAX_PATHve gerçekte olduğu gibi alt dizinler oluşturmanıza izin veriyor gibi görünebilir , ancak aslında "DOS 8.3 dosya isimleri" kullanılarak hile yapıyor. Bunu, aşağıdaki gibi bir ağaç oluşturarak görebilirsiniz:

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

Bu, 696 karakter uzunluğunda, hangisi 260'tan daha uzun, tabii ki. Gezginin en içteki alt dizinine giderseniz, odakta değilken, adrese tıkladığınızda adres çubuğunda beklendiği gibi gösterir. çubuğunda, yolu C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\yalnızca 102 karakter uzunluğunda olan değiştirir.

XP'de bunu yapmaz, bunun yerine desteklenenden daha uzun bir yol oluşturmayı kararlılıkla reddeder.

Gerçekten ilginç olan, NtfsDisable8dot3NameCreationseçenek ayarlandığında Windows 7 Explorer'ın “çok uzun yolları” nasıl kullandığını bulmaktır .


3
İse , uzun MAX_PATH daha bir yol oluşturmak mümkün burada açıklandığı gibi . Maalesef, \\?` doesn't work with rmdir`.
saat

@grawity, evet, fakat bunun nedeni aynı prensipte çalıştığıdır: kısa bir yol daha uzun bir yolla yeniden adlandırılır; bu sadece bir değişkeni manuel olarak yeniden adlandırmanın aksine bir değişkeni genişleterek dinamik olarak yapar. Create komutu toplam uzunluğu belirlemek için yeterli bilgiye sahip olduğunda mutlak yolu çok uzun olan bir dizin oluşturmak mümkün değildir.
Synetech

3
@ Synetech: Hayır, farklı çalışıyor. Gibi yollar \\?\C:\dir\dir\dir\diranlamıyla baypas MAX_PATH; ilgili "değişken" yoktur. (Ama dediğim gibi, bu çalışmaz rmdirdiğer ya cmd.exenedense builtins.)
grawity

örneğin, çalışmayı deneyin md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 . Dosya sistemi, toplam yol uzunluğunun 263 karakter olacağını belirlemek için yeterli bilgiye sahip olduğundan başarısız olur.
Synetech

2
(Ayrıca, yol uzunluğunu bileşen uzunluğuyla karıştırmayın . 255 karakterden daha uzun bir ada sahip tek bir dizine sahip olamazsınız, ancak bundan daha uzun bir yolunuz olabilir .)
Grawity

17

substSanal sürücü oluşturmak için yolu kısaltabilirsiniz :

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

Sanal sürücüye geç:

cd Z:

Şimdi dosyaları silebilirsiniz:

del *.*

Sanal sürücüyü çıkarın:

cd C:\TEMP
subst Z: /d

Dizini kaldır:

rd /s dir1

Hayır; Dizin çok uzunsa bu ilk komut işe yaramazsa; hata parametresini döndürür .
Synetech

2
@Synetech, elbette, ancak sadece sübvanse ederseniz, C:\TEMP\dir1\dir1\dir1bunun bir kısmını kısaltacaktır, böylece içeri girmenize izin verir. ;)
Bobson

@ Bobson, tamam haklısın; İkiniz için +1. :-)
Synetech

10

Robocopy'nin dikkatsiz kullanımı ve Homeserver'ın yedeği tarafından oluşturulan benzer derin bir yapıyı silmeme yardımcı olacak küçük bir C # uygulaması yazdım; Robocopy, varsayılan olarak ortak noktaları normal klasörler olarak ele alır ... :-( Farketmeden büyük bir karmaşaya yol açabilirsiniz.

Araç, herkesin kullanması için CodePlex'te kaynak dosyalarıyla birlikte kullanılabilir.

http://deepremove.codeplex.com


ESERLERİ!!! Bu cevap çalışıyor olarak işaretlenmiş olmalı! Yazılım tereyağı gibi çalışıyor .. birkaç saniyede probumu çözdüm !! Teşekkür ederim!
Rafique Mohammed,

7

Bir süre önce, bu görevi kolayca gerçekleştirmek için kullanabileceğiniz DeleteFiles adlı , çalıştırılabilir küçük bir yardımcı program oluşturdum .

Bu kendi kendine yeten yardımcı programı kullanarak şunları yapabilirsiniz:

deletefiles c:\yourfolder\subfolder\*.* -r -f

tüm klasör yapısını silmek için. -r -f (kullanırsanız hepsi olacak boş herhangi klasörleri siler, aşağı başlangıç dizinden klasör hiyerarşisini recurses . filespec gibi). DeleteFiles, Windows MAX_PATH sınırından daha uzun yolları destekler, böylece derinlemesine yuvalanmış klasörlerde gayet iyi çalışır.

DeleteFiles ücretsiz ve açık kaynak kodludur ve ikili ya da kaynak kodunu GitHub'dan alabilir ya da doğrudan Chocolatey kullanarak yükleyebilirsiniz.


Teşekkürler, harika bir araç, ++ onu çikolataya koymak için;) CI aracına entegrasyonu kolaylaştırır!
Charles Ouellet

1
Bu hile yaptı. Uzun bir yolunuz varsa, > NULsonuna kadar ekleme işlemi daha hızlı hale getirebilir.
ryscl

Robocopy çözümü benim için işe yaramadı ve Synetech'in çözümü de yoktu. DeleteFiles benim için çalıştı, ancak bazı nedenlerden dolayı, tüm alt klasörlerin silinmesi için üç kez çalıştırmam gerekti. Her durumda, bu benim sorunumu çözdü.
Frank,

Re: DeleteFiles 3 kez çalıştırıyor. Bunu da gördüm - dosya silindikten sonra bile kısa bir süre içinde klasör bulunan dosyaları kilitleyen bazı Windows tuhaflıkları nedeniyle inanıyorum. Birden çok geçiş, bu sorunun alt klasörlerde ara sıra başarısızlığa uğradığını - bunun potansiyel olarak çoklu yuva oluşturduğunu - yakalar. Derin ağaçların Explorer delikleriyle aynı davranışları görüyorum.
Rick Strahl

5

Şimdi Basit ve Kolay

Çok uzun zamandır bu sorunu yaşadım node_modules ile çok iç içe klasörler. bu yüzden nihayet yolları kısaltarak klasörleri silebilecek düzeltmek için bir komut dosyası yaptı.

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules

Tasarımcıların neden bir yapıya her bağımlılığı düz bir yapıyla yapabildiklerini dahil etmeyi seçtiklerini bilmiyorum. Bu yüzden bu senaryo benim için en kolay yoldu çünkü zaten node.js kullanıyorum
user2610529

4

Sikuli ile çalışırken programdaki hesaplanamayan bir miktarda "calculator.sikuli.calculator.sikuli" dir. Ağacı hareket ettirebilirim, ancak yol adı silmek için çok uzun.

Popd loop ile birkaç çözüm denedikten sonra, Scandisk ve hiçbir yerde (algılanabilir) hiçbir yerde ....

Bu betiği özyinelemeli direklere ('a' denilen bir direkte) derine inmek, 'b' denilen bir direkte taşımak, sonra da kesilmiş ağacı silmek, geri ('a') taşımak için yazdım. , ve tekrar et:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM Sonsuz özyinelemeli alt klasörleri silmek için kullanılır
  • REM, önce Windows Search hizmetini durdurmayı önerir (services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

Bu sadece toplu iş dosyasını yeniden çalıştırmak için yapılan bir çağrıdır.


Bunu incelemek için saatler harcadım. Bu .bat dosyası cennetten gelen bir hediye gibidir. Silo, sen bir meleksin. xD
Squish

2

Tutulma, sabit diskler üzerinde çöp oluşturmaya karar verdiğinde, işte böyle bir sorun yaşadık. İçine boş bir dizini yansıtmak için robocopy / MIR işlevini kullanarak düzelttik.


1

Bir komut istemi açıp çalıştırmayı deneyebilirim:

rmdir /s <directory>

Bu işe yaramazsa, dizin ağacına yarıya cdlerim ve dizinlerin bir alt kümesini silmeyi denerdim - en içteki 20 dizini söylerim - ve sonra oradan çıkmaya çalışırım.


1
Önerinizi yukarıda denedim ve yine de yukarıdaki komutu birkaç seviyede çalıştırdığımda hala "Dizin boş değil" diyor
user39186 11.03

1
Çünkü bu yöntem geriye doğru. ;-)
Synetech

1

Bu bir ağ klasörü ise o yönetmenin ana dizinini paylaşın ve yerel makinenizdeki bir sürücüye eşleyin ve ardından klasörünüzü silin.


21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** fa tal hatası - windows ortamını okurken iç hata - çok fazla ortam değişkeni var mı?
user39186

20 seviyeli iç içe bir alt klasörü taşımayı denedim ve yukarıdaki hatayı aldım
user39186 11:11

1

Bir komut istemi açın.

En yüksek 'dir1' i içeren klasöre / dizine gidin (C: \ kabul edelim)

c:\> RD /s dir1

Düzenle (yorum eklendikten sonra) :

Diğer fikirler:

MS burada sorunla nasıl başa çıkılacağı (denenecek birçok fikir) hakkında bilgi sunuyor .

Ayrıca bu araç var (asla kişisel olarak kullanılmadı) - TooLongPath .

Belki (Eclipse'e sahip olduğunuzdan beri) tüm yol boyunca gezinen ve bir klasördeki seviyeyi geriye çeken bir şey yazabilirsiniz.


1
Yukarıdaki komutu kullanırken aşağıdaki 3 hatayı alıyorum. Dizin boş değil Sistem belirtilen yolu bulamıyor Dosya adı çok uzun
user39186 11:11


Bu benim için win7 çalıştı! teşekkürler
leoh

1

Başka bir çözüm: Toplam Komutanı indir git. Çok yararlı bir program, sadece uzun dosya adının farkında olduğu için değil.

Kayıtsız sürüm nagware ama tamamen işlevseldir, işi yapacak.


1

Bu, doğrudan komut satırından veya bir toplu iş dosyasından silmek istediğiniz dizine bir UNC yolu oluşturarak yapılabilir.

yerine

rmdir /s/q c:\mydirectory

kullanım

rmdir /s/q \\?\c:\myDirectory

Bunun gibi UNC tarzı yollar çok daha uzun olabilir ve 260 karakterlik sınırı geçebilir.


Çalışmıyor The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 64 bit.
Victor,

Windows 10 için çalışmıyor. Hala çok uzun.
BananaAcid

`\\?` Sürümü benim için Windows 10'da çalıştı!
Peter,

0

Bu sorunu yaşadığımda, klasör adlarından bazılarını çok daha kısa bir adla değiştirdim, sonra toplam yol yeterince kısa olduğunda, Tamam'ı silecek. Fazladan alete gerek yok.


Evet, ama dediğim gibi, dışarıdan içeri girmelisin, yoksa işe yaramaz.
Synetech

Tabii ki. Genelde en uzun klasör adlarının ilk (yama klasörlerinde) veya son olma eğiliminde olduğunu buldum. Çoğu zaman, doğru uzunluğa ulaşmak için yalnızca bir veya iki klasör adını değiştirmeniz gerekir.
music2myear

Evet, ama en içteki olanla başlarsanız, çalışmaz çünkü renkomut başarısız olur path too long.
Synetech

1
Evet, yukarıda verilen komut dosyaları, bu sorunu otomatik olarak ele almanın akıllıca ve etkili bir yöntemidir. Sadece birkaç kez başıma geldi ve bu yüzden el ile yeniden adlandırma işlemini kullandım. Bunu yapmak için, rahatsız edici ağaçta olduğum her yerde klasör yapısını yeniden adlandırmaya başlıyorum ve deneyimlerim ağaç yapısının başında veya sonunda daha sık görülen en uzun klasör adları. Cevabım bu nedenle geçerli bir cevap, muhtemelen en güçlü veya en zeki değil. Düşüşe değmez.
music2myear

> Nerede olursam olalım, klasör yapısını yeniden adlandırmaya başlıyorum. Eh, evet, zaten ağacın içindeyseniz, kesinlikle en azından bu klasörü yeniden adlandırabilirsiniz (bunun için ebeveynine gitmeniz gerekir) ; bir alt klasörü de yeniden adlandırabilirsiniz, ancak çok uzun olabilir.
Synetech 10:11

0

Özyinelemeli bir Cobian Yedekleme görevi tarafından yaratılmış olması dışında aynı sorunu yaşadım. Ücretsiz Cobian yazılımının bu sinir bozucu iç içe klasörleri kolayca süper hızla kaldırabilen bir Deleter uygulaması içerdiğini gördüm .

Araçlar menüsünün altında bulunur.


0

Bazı Java uygulamalarının yaptığı 5000'den fazla dizin derinlemesine klasör karışıklığıyla aynı sorunu yaşadım ve bu klasörü kaldırmanıza yardımcı olacak bir program yazdım. Kaynak kodun tamamı bu bağlantıda:

https://gitlab.imanolbarba.net/imanol/DiREKT

Bir süre sonra her şeyi sildi, ancak işi yapmayı başardı, umarım (benim gibi) aynı sinir bozucu mesele ile karşılaşan insanlara yardım eder.


-3

Dosya sisteminiz bozuk olabilir. Bir şeyi tamir edip etmediğini görmek için chkdsk komutunu çalıştırın, ardından klasörü silmeyi deneyin.


Hayır, sorun bu değil. Sorun, toplam yol uzunluğunun desteklenenden daha uzun olmasıdır ( MAX_PATH=255). Bu , bozuk bir dosya sistemiyle bile olabilir .
Synetech

Klasör üzerinde chkdsk çalıştırmak bana aşağıdaki hatayı verdi. Sürücü, yol veya dosya adı geçerli değil
user39186 11:11
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.