Як видалити папку, яка вкладена досить глибоко, і уникнути "Ім'я файлу занадто довго"?


70

Eclipse створив темп-папку в одному з каталогів, який вкладений досить глибоко, наприклад

dir1\dir1\dir1\dir1\...

Я не можу видалити цю папку в Windows через Провідник, команди delабо rmdirкоманди, а також команду Cygwin 'rm'. Як слід видалити цю дуже довгу папку?

Він просто продовжує говорити "Ім'я файлу занадто довго ..."


Відповіді:


105

Якщо ви такі, як я, і вам не подобається встановлювати додаткове програмне забезпечення, щоб вирішити подібну проблему, я б попросив запропонувати XQYZ і використати robocopyдля вирішення проблеми. (У моєму випадку проблема була створена в першу чергу роботокопією, скопіювавши каталог, який мав в ньому рекурсивні точки з'єднання, не поставляючи / XJ на робокопію).

Щоб видалити дерево каталогів, починаючи з c: \ subdir \ more \ vioting_dir :

Загальний покроковий процес настільки ж просто:

  1. cd c:\subdir\more ввести його в батьківський каталог.
  2. mkdir empty створити порожній каталог.
  3. robocopy empty offending_dir /mir відобразити порожній каталог у образотворчому.
  4. Після деякого очікування ви закінчите! Закінчіть це:
  5. rmdir offending_dir позбутися тепер порожнього каталогу образи та
  6. rmdir empty щоб позбутися проміжного порожнього каталогу.

2
Відмінна пропозиція. Мою проблему також створила роботокопія, і, як ви описали, виправлення роботикопію працювало на мене.
Натан Гарабедян

3
Я також зробив безлад robocopyі точки з’єднання; дякую, що показали мені, як його використовувати для очищення безладу!
Mr.Wizard

мої папки не були створені роботокопією, але це їх прекрасно видалило
Саша,

11
Менеджер пакетів вузлів (NPM) викликав цю проблему для мене. Чомусь вкладених пакетів чомусь було.
Девід Шеррет

це, очевидно, найкраща і найрозумніша відповідь, набагато краща за замовлення рекурсивного пакетного сценарію
монашесько-панічно

39

Це насправді досить просто виправити. Скажіть, що структура каталогу така:

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. Перейдіть до 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 дозволяє створювати підкаталоги таким чином, що загальна довжина перевищує MAX_PATH, а по суті це є, однак насправді це обман, використовуючи «назви файлів DOS 8.3». Це можна побачити, створивши дерево, наприклад:

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

Це довжина 696 символів, що, звичайно, набагато довше 260. Крім того, якщо ви переходите до найпотаємнішого підкаталогу в Провіднику, він показує його таким, як очікувалося, в адресному рядку, коли він не в фокусі, але коли ви натискаєте адресу бар, він змінює шлях до 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параметр.


3
Це є можливим , щоб створити шлях довший , ніж MAX_PATH, як описано тут . На жаль, \\?` doesn't work with rmdir`.
grawity

@grawity, так, але це тому, що він працює за однією і тією ж головою: короткий шлях перейменований на довший; що просто робить це динамічно, розширюючи змінну, на відміну від ручного перейменування її в лайнджер. Неможливо створити каталог, абсолютний шлях якого занадто довгий, коли команда створення має достатньо інформації для визначення загальної довжини.
Synetech

3
@Synetech: Ні, це працює інакше. Шляхи на зразок \\?\C:\dir\dir\dir\dirбуквально обходять MAX_PATH; немає ніяких "змінних". (Але, як я вже говорив, чомусь це не працює з rmdirіншими cmd.exeвбудованими
елементами

наприклад, спробуйте запустити md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Це не буде працювати, оскільки файлова система має достатньо інформації, щоб визначити, що загальна довжина шляху складе 263 символи, тому вона не працює.
Synetech

2
(Крім того, не плутайте довжину шляху з довжиною компонента . У вас не може бути єдиного каталогу з іменем понад 255 символів; проте, ви можете мати шлях набагато довший за нього.)
grawity

17

Можна скоротити шлях за допомогою 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

Ніпе; перша команда не буде працювати, якщо каталог занадто довгий; він поверне помилку Недійсний параметр .
Synetech

2
@Synetech, звичайно, але якщо ви просто заміняєте, C:\TEMP\dir1\dir1\dir1то це скоротить її частину, тим самим дозволяючи вам увійти. Це так само, як ваша пропозиція про перейменування, але замість цього замість карти. ;)
Бобсон

@Bobson, добре, ти маєш рацію; +1 для вас обох. :-)
Synetech

10

Я написав невеликий додаток C #, щоб допомогти мені видалити подібну дуже глибоку структуру, генеровану недбалим використанням Robocopy та резервного копіювання з Homeserver; за замовчуванням Robocopy трактує спільні точки як звичайні папки ... :-( Ви можете закінчитися великим безладом, не помічаючи цього.

Інструмент доступний у CodePlex із вихідними файлами для будь-кого.

http://deepremove.codeplex.com


РОБОТИ !!! Ця відповідь повинна бути позначена як працююча! Програмне забезпечення працює як масло .. вирішив мою проблему за кілька секунд !! Дякую!
Рафік Мухаммед

7

Деякий час тому я створив невелику автономну виконувану утиліту під назвою DeleteFiles, яку ви можете використовувати для легкого виконання цього завдання.

Використовуючи цю автономну утиліту, ви можете просто зробити:

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

щоб видалити всю структуру папки. -r повторює ієрархію папок зі стартового каталогу вниз, -f видаляє порожні папки (які будуть усі вони, якщо ви будете використовувати . як filepec). DeleteFiles підтримує шляхи довші, ніж обмеження для Windows MAX_PATH, тому він буде добре працювати на глибоко вкладених папках.

DeleteFiles є безкоштовним та відкритим кодом, і ви можете захопити двійковий або вихідний код з GitHub або встановити безпосередньо за допомогою Chocolatey


Дякую, приголомшливий інструмент, ++ за те, що він додає шоколадний колір;) Це дозволяє легко інтегруватися в інструмент CI!
Чарльз Оуеллет

1
Це зробило трюк. Якщо у вас дійсно довгий шлях, додавання > NULдо кінця може зробити процес швидшим.
ryscl

Рішення роботокопії не працювало для мене, а також рішення Synetech. DeleteFiles працював на мене, але мені чомусь довелося запустити три рази, щоб усі папки були видалені. У будь-якому випадку це вирішило мою проблему.
Френк

Re: запуск DeleteFiles 3 рази. Я також бачив це - я вважаю, що це пов’язано з деякими химерностями Windows, які блокують папки з файлами в них на короткий час, навіть коли файли були видалені. Кілька пропусків уловлюють випадкові збої в цьому питанні в папках - потенційно багато вкладених. Я бачу таку саму поведінку з видаленням Explorer із глибоких дерев.
Рік Страль

5

Просте та легке зараз

Я стикався з цією ж проблемою, так довго, як node_modules, які дуже вкладені папки. тому нарешті зробили сценарій, щоб виправити те, що може видалити папки, скорочуючи шляхи.

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

npm install fdel -g

fdel ./node_modules

Я не знаю, чому дизайнери вирішили включити кожну залежність до структури, коли вони могли зробити її з плоскою структурою. Тож цей сценарій був для мене найпростішим способом, оскільки я вже використовую node.js
user2610529,

4

Під час роботи з Sikuli я потрапив у розрив циклу рекурсії Calculator.sikuli в програмі, який зробив незліченну кількість "dir" калькулятора.sikuli.calculator.sikuli. Я міг би перемістити дерево, але ім'я шляху занадто довге, щоб видалити.

Спробувавши кілька рішень з popd циклом, Scandisk і потрапляння (помітно) нікуди….

Я написав цей сценарій, щоб "заглибитись" у повторювані дрі (у dir, який називається "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 (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

Це лише заклик знову запустити пакетний файл.


Я витратив години на розгляд цього. Цей файл .bat - як подарунок з неба. Ти, силос, ангел. xD
Сквіш

2

У нас виникла така проблема на роботі, коли затемнення вирішило створити сміття на жорстких дисках. Ми виправили це за допомогою функції robocopy / MIR для відображення порожнього каталогу в вкладений.


1

Я б спробував відкрити командний рядок і запустити:

rmdir /s <directory>

Якщо це не спрацює, я б вписався в дерево каталогів і спробував би видалити підмножину каталогів - скажімо, 20 найпотаємніших каталогів - і потім пропрацював би шлях звідти.


1
Я спробував вашу пропозицію вище, і вона все ще говорить "Каталог не порожній", коли я запускаю вищезгадану команду на кілька рівнів глибоко
user39186

1
Це тому, що цей метод є зворотним. ;-)
Synetech

1

Якщо це мережева папка, тоді просто поділіться батьківським каталогом цього каталогу та нанесіть його на диск на локальній машині, а потім видаліть свою папку.


21966 [головна] mv 1288 D: \ робота \ програмне забезпечення \ cygwin \ bin \ mv.exe: *** фальшива помилка - внутрішня помилка при читанні середовища Windows - занадто багато змінних середовища?
користувач39186

Я спробував перемістити підпапку aa, яка вкладена в 20 рівнів глибше, і отримала вищезгадану помилку
user39186

1

Відкрийте командний рядок.

Перейдіть до папки / каталогу, що містить найвищий 'dir1' (будемо вважати C: \)

c:\> RD /s dir1

Редагувати (після доданих коментарів) :

Інші ідеї:

MS пропонує інформацію про те, як вирішити проблему (багато ідей, які можна спробувати) тут .

Також є цей інструмент (ніколи його не використовував особисто) - TooLongPath .

Можливо, напишіть щось (оскільки у вас Eclipse), яке орієнтується на весь шлях, а потім резервує по одному папку за один раз, видаляючи, як це йде?


1
Я отримую наступні 3 помилки під час використання вищевказаної команди. Каталог не порожній Система не може знайти вказаний шлях Ім'я файлу занадто довге
user39186

Я спробував пройти глибокий рівень n і намагався використовувати ту саму команду, але, схоже, це не допоможе
user39186

це працювало для мене на win7! дякую
leoh

1

Ще одне рішення: перейдіть до завантаження Total Commander. Це дуже корисна програма не тільки тому, що вона знає довге ім'я файлу.

Незареєстрована версія є nagware, але повністю функціональна, вона зробить роботу.


1

Це можна зробити безпосередньо в командному рядку або в пакетному файлі, побудувавши шлях UNC до каталогу, який потрібно видалити

тому замість

rmdir /s/q c:\mydirectory

використання

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

Такі шляхи у стилі UNC можуть бути набагато довшими та перевищувати межу 260 знаків.


Не працює. 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-розрядні.
Віктор

Не працює для Windows 10. Ще занадто довго.
BananaAcid

Версія `\\?` Працювала для мене на Windows 10!
Пітер

0

Коли у мене є ця проблема, я просто перейменую деякі назви папок набагато коротше, а після того, як загальний шлях буде досить коротким, він видалить ОК. Не потрібні додаткові інструменти.


Так, але, як я вже сказав, вам доведеться працювати зовні, бо інакше це не вийде.
Synetech

Звичайно. Як правило, найдовші назви папок мають бути першими (у папках з патчами) або останніми. Здебільшого вам потрібно змінити лише одну чи дві назви папок, щоб домогтися правильної довжини.
music2myear

Так, але якщо ви почнете з найпотаємнішого, він не працюватиме, оскільки renкоманда не вдасться path too long.
Synetech

1
Так, наведені вище сценарії є розумним та ефективним методом автоматичного вирішення цієї проблеми. Зі мною це траплялося лише кілька разів, і тому я просто використовував процес перейменування вручну. Для цього я просто починаю перейменовувати структуру папок, де б я не опинився в дереві-порушнику, і мій досвід - найдовші імена папок частіше з’являються на початку або в кінці структури дерева. Тому моя відповідь є достовірною, хоча, мабуть, не найсильнішою чи найрозумнішою тут. Це не варто.
music2myear

> Я просто починаю перейменовувати структуру папок, де б я не опинився в дереві-порушнику. Ну, так, якщо ви вже знаходитесь в дереві, то ви, звичайно, можете перейменувати принаймні цю папку (вам потрібно буде перейти до її батьківського) ; ви можете також перейменувати підпапку, але це може бути занадто довгим.
Synetech

0

У мене була така ж проблема, за винятком того, що вона була створена рекурсивним завданням резервного копіювання Cobian. Виявляється, безкоштовне програмне забезпечення Cobian включає в себе програму Deleter, яка може легко швидко видалити ці дотепні вкладені папки.

Він розташований під меню інструментів.


0

Я зіткнувся з тією ж проблемою з безладною папкою в 5000 директорій, яку зробив деякі програми Java, і я написав програму, яка допоможе вам видалити цю папку. Весь вихідний код знаходиться за цим посиланням:

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

Через деякий час це все усунуло, але вдалося виконати роботу, я сподіваюся, що це допомагає людям, які (як і я) стикаються з тим самим розчаруючим питанням


-3

Ваша файлова система може бути пошкодженою. Запустіть chkdsk, щоб побачити, чи він щось ремонтує, а потім спробуйте видалити папку.


Ні, це не проблема. Проблема полягає в тому, що загальна довжина шляху довша, ніж підтримується ( MAX_PATH=255). Це може статися навіть із некорумпованою файловою системою.
Synetech

Запуск chkdsk у папці дав мені таку помилку. Привід, шлях або ім’я файлу недійсні
user39186
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.