سؤال كيف يمكنني حذف مجلد متداخل تماماً وتجنب "اسم الملف طويلاً جدًا"؟


قام Eclipse بإنشاء مجلد مؤقت في أحد الدلائل المتداخلة تمامًا ، على سبيل المثال ،

dir1\dir1\dir1\dir1\...

يتعذر عليّ حذف هذا المجلد في Windows عبر Explorer ، و del أو rmdir الأوامر ، ولا الأمر Cygwin 'rm'. كيف يمكنني إزالة هذا المجلد الطويل جدًا؟

يبقى فقط يقول "اسم الملف طويل جدا ..."


65
2018-03-11 04:30


الأصل


ممكن من الازدواجية لا يمكن حذف المجلد. مجلدات لا نهائية من حلقات تم إنشاؤها داخل بعضها البعض - bwDraco


الأجوبة:


إذا كنت مثلي ولا تحب تثبيت برامج إضافية لإصلاح مشكلة كهذه ، فسأذهب معها اقتراح XQYZ ل والاستخدام robocopy لحل المشكلة. (في حالتي تم إنشاء المشكلة عن طريق النسخ في المقام الأول ، عن طريق نسخ دليل يحتوي على نقاط اتصال متكررة في ذلك دون تزويد / XJ بالنسخ).

لحذف شجرة الدليل ابتداء من ج: \ subdir \ أكثر \ offending_dir:

عملية الخطوة خطوة بخطوة بسيطة مثل:

  1. cd c:\subdir\more لإدخالها في دليلها الأصلي.
  2. mkdir empty لإنشاء دليل فارغ.
  3. robocopy empty offending_dir /mir يعكس الدليل الفارغ في واحد المخالف.
  4. بعد الإنتظار انتهيت! انتهى الامر مع:
  5. rmdir offending_dir للتخلص من الدليل المسيء الآن الفارغ و
  6. rmdir empty للتخلص من الدليل الفارغ الوسيطة.

95
2018-06-12 21:27



اقتراح ممتاز. تم إنشاء مشكلتي أيضًا عن طريق robocopy ، وكما وصفت إصلاح النسخة بنجاح. - Nathan Garabedian
أنا أيضا جعل الفوضى مع robocopy ونقاط التوصيل شكرا لإظهار لي كيفية استخدامها لتنظيف الفوضى! - Mr.Wizard
لم يتم إنشاء المجلدات الخاصة بي عن طريق robocopy ولكن إزالتها تماما - Sasha
تسبب مدير حزمة عقدة (NPM) هذه المشكلة بالنسبة لي. كان هناك الكثير من الحزم المتداخلة لسبب ما. - David Sherret
من الواضح أن هذه هي الإجابة الأفضل والأكثر اعتدالاً ، أفضل بكثير من النص البرمجي المعاد - monastic-panic


هذا هو في الواقع بسيط جدا لإصلاح. قل أن بنية الدليل هي على هذا النحو:

C:\Dir1\Dir1\Dir1\Dir1…

لإصلاحها ، فقط قم بإعادة تسمية كل مجلد إلى اسم مجلد مكون من حرف واحد إلى أن لم يعد من الضروري حذفه:

  1. إعادة تسمية C:\Dir1 إلى C:\D
  2. انتقل إلى C:\D\
  3. إعادة تسمية C:\D\Dir1 إلى C:\D\D
  4. انتقل إلى C:\D\D\
  5. Goto 1 حتى إجمالي طول المسار هو <260

في ما يلي ملف دفعي لأتمتة العملية (هذا الإصدار البسيط هو الأفضل لدلائل بسيطة مثل تلك الموضحة في السؤال ، خاصة تلك التي يمكن التخلص منها). قم بتمريره أعلى مجلد ممكن (على سبيل المثال C:\Dir1 إلى عن على C:\Dir1\Dir1\Dir1… أو C:\Users\Bob\Desktop\New Folderإلى عن على 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

شرح فني

الحلول المقترحة الأخرى هي عكسية. لا يمكنك إصلاحه من خلال العمل في طريقك من الدليل الأعمق للخارج ، يجب عليك الذهاب في الاتجاه الآخر.

عند محاولة الوصول إلى دليل ، يمكنك القيام بذلك باستخدام المسار المطلق الخاص به سواء بشكل صريح أو غير صريح ، والذي يتضمن كل ما يأتي قبله. لذلك ، لهيكل دليل مثل C:\Dir1\Dir1\Dir1\Dir1، طول الطريق إلى الأعمق Dir1 هو 22. ومع ذلك فإن طول المسار إلى أبعد Dir1 هو 7 فقط ، وبالتالي لا يزال الوصول إليها بغض النظر عن محتوياته (في سياق مسار الدليل المحدد ، فإن نظام الملفات لا يعرف ما يحتوي عليه أو تأثيره على طول المسار الكلي للدلائل التابعة له ؛ فقط أدلة الأسلاف - لا يمكنك إعادة تسمية الدليل إذا كان طول المسار الكلي طويلاً جدًا).

لذلك ، عندما تواجه مسارًا طويلاً ، ما عليك فعله هو الانتقال إلى أعلى مستوى ممكن وإعادة تسميته إلى اسم حرف واحد وتكراره لكل مستوى فيه. في كل مرة تفعل ذلك ، يتم تقصير إجمالي طول المسار حسب الاختلاف بين الاسم القديم والاسم الجديد.

العكس هو الصحيح أيضا. لا يمكنك إنشاء مسار أكبر من الحد الأقصى للطول المدعوم (على DOS و Windows ، MAX_PATH = 260). ومع ذلك ، يمكنك إعادة تسمية الدلائل ، التي تعمل من الأعمق إلى الخارج ، إلى اسم أطول. والنتيجة هي أن المجلدات الأعمق التي يكون مسارها المطلق هو 260 لا يمكن الوصول إليها. (هذا لا يجعلها "مخفية" أو آمنة ، نظرًا لأنها بسيطة بما يكفي للوصول إليها ، لذلك لا تستخدم هذه الطريقة لإخفاء الملفات.)


ملاحظة جانبية مثيرة للاهتمام

إذا قمت بإنشاء مجلدات في Windows 7 Explorer ، فقد يبدو أن Explorer يسمح لك بإنشاء أدلة فرعية بحيث يكون الطول الإجمالي أطول من MAX_PATH، وفي الواقع هو ، ولكن في الواقع هو الغش باستخدام "أسماء ملفات 8.3 DOS". يمكنك رؤية ذلك عن طريق إنشاء شجرة مثل ما يلي:

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

يبلغ طوله 696 حرفًا ، وهو بالطبع أطول من 260 حرفًا. وعلاوة على ذلك ، إذا انتقلت إلى الدليل الفرعي الأعمق في Explorer ، فسيعرضه كما هو متوقع في شريط العناوين عندما لا يكون في بؤرة التركيز ، ولكن عند النقر على العنوان شريط ، فإنه يغير الطريق إلى C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\والذي يبلغ طوله 102 حرفًا فقط.

في XP ، فإنه لا يفعل ذلك ، وبدلاً من ذلك يرفض بثبات إنشاء مسار أطول من المدعومة.

ما من المثير للاهتمام حقاً هو معرفة كيف يعالج Windows 7 Explorer "مسارات طويلة جدًا" عندما يكون NtfsDisable8dot3NameCreation يتم تعيين الخيار.


38
2018-03-11 05:49



هذا هو ممكن لإنشاء مسار أطول من MAX_PATH ، كما هو موضح هنا. للأسف، \\?` doesn't work with rmdir`. - grawity
grawity ، نعم ، ولكن ذلك لأنه يعمل تحت نفس المدير: يتم إعادة تسمية مسار قصير إلى واحد أطول ؛ التي تفعل ذلك بشكل ديناميكي عن طريق توسيع متغير بدلاً من إعادة تسميته يدويًا إلى la one onger. ليس من الممكن إنشاء دليل يكون مساره المطلق طويلاً للغاية عندما يحتوي أمر الإنشاء على معلومات كافية لتحديد الطول الإجمالي. - Synetech
Synetech: لا ، إنها تعمل بشكل مختلف. مسارات مثل \\?\C:\dir\dir\dir\dir حرفيا الالتفافية MAX_PATH. لا توجد "المتغيرات" المعنية. (ولكن كما قلت ، فإنه لا يعمل مع rmdir أو غيرها cmd.exe بنيت لسبب ما.) - grawity
على سبيل المثال ، حاول تشغيل md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789  لن ينجح ذلك نظرًا لأن نظام الملفات يحتوي على معلومات كافية لتحديد أن طول المسار الإجمالي سيكون 263 حرفًا ، لذلك يفشل. - Synetech
(أيضا ، لا تخلط بين مسار طول مع مكون الطول. لا يمكنك الحصول على دليل واحد مع أكثر من 255 حرفًا ؛ ومع ذلك ، يمكنك الحصول على مسار أطول من ذلك بكثير.) - grawity


يمكنك تقصير المسار باستخدام subst لإنشاء محرك أقراص افتراضي:

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

التغيير إلى محرك الأقراص الظاهري:

cd Z:

الآن يمكنك حذف الملفات:

del *.*

قم بإزالة محرك الأقراص الظاهري:

cd C:\TEMP
subst Z: /d

قم بإزالة الدليل:

rd /s dir1

16
2017-09-06 15:12



كلا؛ لن يعمل هذا الأمر الأول إذا كان الدليل طويلاً جدًا ؛ سيعود الخطأ معلمة غير صالحة. - Synetech
Synetech ، بالتأكيد ، ولكن إذا كنت تحل محل فقط C:\TEMP\dir1\dir1\dir1، ثم سيختصر جزء منه ، مما يسمح لك بالوصول إليه. إنه يشبه اقتراحك بإعادة التسمية ، ولكن مع التخطيط بدلاً من ذلك. ؛) - Bobson
Bobson ، حسنًا ، أنت على حق ؛ +1 لكل منكما. :-) - Synetech


لقد كتبت تطبيقًا صغيرًا من C # لمساعدتي في حذف بنية مشابهة جدًا ناتجة عن استخدام مهمل لـ Robocopy ونسخة احتياطية من Homeserver ؛ بشكل افتراضي يعامل Robocopy النقاط المشتركة كمجلدات عادية ... :-( قد ينتهي بك الأمر مع فوضى كبيرة دون أن يلاحظ ذلك.

تتوفر الأداة في CodePlex مع الملفات المصدر ، لاستخدام أي شخص.

http://deepremove.codeplex.com


10
2018-04-16 01:36



يعمل !!! يجب وضع علامة على هذه الإجابة بأنها تعمل! يعمل البرنامج مثل الزبد .. حل مشكلتي في ثواني قليلة !! شكرا لكم! - Rafique Mohammed


منذ بعض الوقت أنا خلقت منفعة صغيرة مكتفية ذاتياً قابلة للتنفيذ تسمى حذف الملفات التي يمكنك استخدامها لتنفيذ هذه المهمة بسهولة.

باستخدام هذه الأداة المساعدة المستقلة ، يمكنك ببساطة القيام بما يلي:

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

لحذف بنية المجلد بالكامل. - يقوم بتكرار التسلسل الهرمي للمجلدات من دليل البدء لأسفل ، -f يحذف أي مجلد فارغ (والذي سيكون جميعًا إذا كنت تستخدم . مثل filespec). يدعم DeleteFiles مسارات أطول من الحد الأقصى لـ Windows MAX_PATH حتى يعمل بشكل جيد على المجلدات المتداخلة بعمق.

DeleteFiles مجاني ومصدر مفتوح ويمكنك انتزاع إما رمز ثنائي أو مصدر من جيثب أو تثبيت مباشرة باستخدام تشوكولاتيي


7
2018-03-26 00:19



شكرا ، أداة رهيبة ، ++ لوضعها في chocolatey ؛) يجعل من السهل على الاندماج في أداة CI! - Charles Ouellet
هذا لم الحيلة. إذا كان لديك مسار طويل بالفعل ، مضيفا > NUL إلى النهاية يمكن أن يجعل العملية أسرع. - ryascl
لم يعمل حل roboupe لي ولا حل Synetech ل. عملت DeleteFiles بالنسبة لي ، ولكن لسبب ما كان لي لتشغيله ثلاث مرات لحذف جميع المجلدات الفرعية. على أي حال ، هذا حل مشكلتي. - Frank
إعادة: تشغيل DeleteFiles 3 مرات. لقد رأيت ذلك أيضًا - أعتقد أنه يرجع إلى بعض عمليات حل مشكلات Windows التي تقوم بتأمين المجلدات بالملفات الموجودة بها لفترة قصيرة حتى بعد حذف الملفات. تمسكت التمريرات المتعددة الفشل العرضي لهذه المشكلة في المجلدات الفرعية - من المحتمل أن تكون متداخلة متعددة. أرى نفس السلوك مع Explorer يحذف الأشجار العميقة. - Rick Strahl


بسيطة وسهلة الآن

كنت تواجه هذه المشكلة نفسها منذ فترة طويلة مع node_modules التي المجلدات المتداخلة جدا. حتى جعل في النهاية النصي لإصلاح ما يمكن حذف المجلدات عن طريق تقصير المسارات.

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

npm install fdel -g

fdel ./node_modules

5
2018-02-02 14:20



فعلت بشكل جيد! شكر - Erasmus777
لا أعرف لماذا اختار المصممين تضمين كل تبعية في البنية عندما كان بإمكانهم أن يجعلوها ذات بنية مسطحة. لذلك كان هذا البرنامج النصي أسهل طريقة بالنسبة لي حيث إنني أستخدم node.js بالفعل - user2610529


أثناء العمل مع Sikuli حصلت على جاكيد مع حلقة العكسي Calculator.sikuli في البرنامج الذي قدم كمية لا تعد ولا تحصى من dirs "calculator.sikuli.calculator.sikuli". يمكنني نقل الشجرة ، لكن اسم المسار طويل للغاية للحذف.

بعد تجربة عدة حلول مع حلقة popd ، Scandisk والحصول على (بشكل ملحوظ) في أي مكان ....

لقد كتبت هذا البرنامج النصي ليذهب عميقاً إلى dirs المتكرر (في a dir يُدعى 'a') ، قم بنقلهم (إلى a dir تسمى 'b') ، ثم احذف الشجرة المقتطعة ، حركها مرة أخرى (إلى 'a') ، ثم كرر:

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 يستخدم لحذف المجلدات الفرعية المتكررة بشكل غير منتظم
  • يقترح REM لإيقاف خدمة Windows Search أولاً (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

هذا هو مجرد دعوة لتشغيل ملف دفعي مرة أخرى.


4
2017-08-09 09:12



لقد قضيت ساعات في النظر في هذا. هذا الملف .bat هو بمثابة هدية من السماء. أنت ، يا صومعة ، ملاك. الانجاز - Squish


كان لدينا مشكلة مثل هذا في العمل عندما قرر الكسوف لخلق القمامة على harddrives. قمنا بإصلاحه باستخدام وظيفة robocopy / MIR لمراوغة دليل فارغ في واحد متداخل.


2
2018-03-11 06:25





سأحاول فتح موجه الأوامر وتشغيله:

rmdir /s <directory>

إذا لم ينجح ذلك ، فما استقاموا لكم فاستقيموا cd partway في شجرة الدليل ومحاولة حذف مجموعة فرعية من الدلائل - ويقول 20 الدلائل أعمق - ثم تعمل طريقي للخروج من هناك.


1
2018-03-11 04:50



لقد حاولت اقتراحك أعلاه ولا تزال تقول "الدليل ليس فارغًا" عندما أقوم بتشغيل الأمر أعلاه عدة مستويات في العمق - user39186
هذا لأن هذه الطريقة هي عكسية. ;-) - Synetech


إذا كان مجلد شبكة ، فقم فقط بمشاركة الدليل الأصلي للدليل ثم قم بتعيينه إلى محرك أقراص على جهازك المحلي ثم احذف المجلد.


1
2018-03-11 05:02



21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** fa خطأ tal - خطأ داخلي في قراءة بيئة Windows - العديد من متغيرات البيئة؟ - user39186
حاولت نقل مجلد فرعي متداخلة 20 مستويات عميق وحصلت على الخطأ أعلاه - user39186