как удалить каталоги с путями

<p>похоже, что windows пытается ограничить имена файлов при удалении, хотя это не помешает созданию этих файлов.</p><p>наш процесс сборки создает несколько временных файлов (многие из которых основаны на wsdl), которые выходят за пределы этого ограничения. наш скрипт ant каким-то образом может удалить их при выполнении очистки, но иногда мне нужно удалить каталог workarea (куда идут все временные файлы), фактически не выполняя полную очистку от ant.</p><p>это те же ошибки <a href="https://superuser.com/questions/45697/how-to-delete-a-file-on-windows-with-too-long-a-filename">этот вопрос</a> , но ответы на них мне не очень подходят, так как я имею дело с каталогом, а не с файлом, и я не всегда знаю, какие конкретные файлы или подкаталоги вызывают эта проблема. и я пытаюсь избежать любого ручного процесса (кроме запуска одной команды), чтобы фактически удалить их.</p><p>если я пытаюсь удалить каталог из проводника, я получаю сообщение об ошибке</p><pre><code>cannot delete [file name]: the file name you specified is not valid or too long. specify a different file name </code></pre><p>попытка <code>remove-item</code> в powershell выдает следующую ошибку:</p><pre><code>remove-item : the specified path, file name, or both are too long. the fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. at line:1 char:12 + remove-item <<<< -force -recurse <directory> </code></pre><p>кто-нибудь знает какие-либо инструменты или простые способы обойти эту ошибку удаления без необходимости вручную находить проблемные файлы и перемещать/переименовывать их?</p>

<p>я считаю, что нашел способ удалить вещи из <code>cmd</code>. первоначально я попробовал команду <code>del</code>, но это не сработало. тогда я вспомнил <code>rmdir</code>. делать следующее:</p><pre><code>rmdir /s /q <dir> </code></pre><p>кажется, сработало.</p>

<p>используйте файловый менеджер <a href="http://www.7-zip.org/">7-zip</a> , чтобы удалить их.</p><p>если у вас все еще есть проблемы, убедитесь, что вы используете <kbd>shift</kbd>+<kbd>delete</kbd> внутри 7-zip file manager. в противном случае windows попытается переместить их в корзину (что снова приведет к сбою).</p>

<p>ни один из других (бесплатных) ответов здесь не работал для меня, но я нашел один на другом сайте:</p><pre><code>rimraf <dir> </code></pre><p> <a href="https://github.com/isaacs/rimraf">rimraf</a> - это <a href="http://nodejs.org/">пакет node.js</a> , поэтому вам необходимо установить node.js, который включает в себя <a href="https://www.npmjs.org/">npm</a> . тогда вы можете запустить:</p><pre><code>npm install -g rimraf </code></pre><p>затем вы можете запустить <code>rimraf</code> из командной строки.</p><p>я нашел это решение, потому что сам npm вызывал эту проблему из-за того, как он вкладывает зависимости.</p><p>кстати, <code>rimraf</code> получает свое имя от команды unix <code>rm -rf</code>, которая рекурсивно удаляет файлы и папки.</p>

<p><strong> нет необходимости устанавливать какую-либо программу </strong>для решения этой проблемы.</p><p>эта проблема легко решается с помощью <code>robocopy</code>, предустановленной начиная с windows vista, выпущенной в 2006 году.</p><p>например, <code>rmdir /s /q <dir></code> сообщалось о сбое в некоторых случаях. нет необходимости использовать 7zip или любой другой сторонний инструмент. powershell - это излишество. cygwin может работать, но вы можете не установить его. итак, давайте сосредоточимся на <code>robocopy</code></p><p>идея состоит в том, чтобы</p><ol> <li>используйте <code>robocopy</code> для копирования + обновлено</li> <li>из<strong> новая пустая папка </strong></li> <li>в папку, которую вы хотите удалить, цель.</li> </ol><p>после выполнения <code>robocopy</code> целевой каталог также будет пустым.</p><p>эти инструкции для командной строки. просто откройте поиск в windows, введите <code>cmd</code> и нажмите enter.</p><p>допустим,<strong> target </strong>для удаления:</p><pre><code>c:\delete\this folder\with a very long name </code></pre><p>мы действуем следующим образом:</p><ol> <li> <p>сначала создайте пустой каталог, f.i. <code>c:\emptyfolder</code>.</p> <pre><code>mkdir c:\emptyfolder </code></pre></li> <li> <p>скопируйте + обновите из пустой директории до цели, используя опцию <code>/purge</code></p> <pre><code>robocopy c:\emptyfolder "c:\delete\this folder\with a very long name" /purge </code></pre></li> <li> <p>удалить пустой каталог. тебе это больше не нужно.</p> <pre><code>rmdir c:\emptyfolder </code></pre></li> </ol><p>поскольку в исходном каталоге (<code>c:\emptyfolder</code>) нет файлов или папок, он просто рекурсивно удаляет файлы и папки в целевом каталоге (<code>c:\delete\this folder\with a very long name</code>)!</p><ul> <li> <p>последний трюк: вы можете избежать написания от руки</p> <pre><code>c:\delete\this folder\with a very long name </code></pre> <p>перетаскивая папку из окна проводника и опуская в окно терминала/cmd.</p> </li> </ul><p><strong> будьте осторожны </strong>: удаленные файлы<strong> не попадут в корзину </strong>папку! после удаления файлы не могут быть восстановлены.</p><p>(взято из <a href="http://web.archive.org/web/20170302205901/https://blog.bertvanlangen.com/articles/path-too-long-use-robocopy/">"слишком длинный путь? использовать robocopy" от bvlangen</a> )</p><p>ps: я понимаю, что этот ответ был здесь, менее дидактически. <a href="https://superuser.com/a/467814/43193">как удалить файл в windows с слишком длинным именем файла? [дубликат]</a> </p><p> <a href="https://superuser.com/users/50883/benoit">бенуа</a> добавил:</p><blockquote> <p>возможно, вам придется пройти через этот процесс более одного раза, чтобы избавиться от всех файлов.</p> </blockquote>

<p>инструмент, который я использовал, когда у меня была эта проблема, был <a href="http://ipmsg.org/tools/fastcopy.html.en">fastcopy</a> . я выбрал<strong> удалить все </strong>из выпадающего списка, выбрал каталог, который хотел удалить, и нажал<strong> удалить все </strong>.</p><p><img src="https://i.stack.imgur.com/kwabw.png" alt="fastcopy delete dialog screenshot"></p><p>fastcopy переносим (установка не требуется), и доступны 32-битные и 64-битные версии.</p>

<p>cygwin <code>rm -rf</code> хорошо работает на длинных путях!</p>

<p>без установки дополнительного программного обеспечения вы можете использовать команду <code>subst</code> для временного создания псевдонима в каталоге с длинными именами.</p><p>например если вы хотите удалить папку <code>c:\very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted</code>, вы можете использовать команду</p><pre><code>subst x: "c:\very long directory\that exceed\length limit\blah blah blah\abcde" </code></pre><p>и затем вы можете легко удалить <code>x:\folder to be deleted</code> в проводнике windows или в командной строке. чтобы удалить временный псевдоним диска, используйте команду</p><pre><code>subst x: /d </code></pre>

<p>просто перейдите из powershell в команду, запустив ниже:</p><pre><code>cmd /c "rmdir /s /q <dir>" </code></pre>

<p> <a href="https://superuser.com/a/78458/10407">решение dentrasi</a> это то, что лучше всего сработало для меня, но я хотел опубликовать конкретные шаги в ответе верхнего уровня.</p><ol> <li>загрузите и установите последнюю стабильную сборку <a href="http://www.7-zip.org/download.html">7zip</a> .</li> <li>запустите 7zip file manager (<strong> 7zfm.exe </strong>).</li> <li>в диспетчере файлов 7zip перейдите, чтобы увидеть имя папки, которую вы хотите удалить (т. е. вы находитесь в родительской папке).</li> <li>удерживайте кнопку shift.</li> <li>нажмите кнопку «<em>удалить</em>» на клавиатуре или на панели инструментов 7zip file manager;<strong> убедитесь, что вы все еще удерживаете клавишу shift </strong>.</li> <li>нажмите кнопку "<em>ok</em>";<strong> убедитесь, что вы все еще удерживаете клавишу shift </strong>.</li> </ol>

<p>есть две вещи, которые еще не упомянуты в существующих ответах.</p><ol> <li>вы можете использовать расширенный префикс длины пути для доступа к длинным путям</li> <li>в windows 10 вы можете включить поддержку длинных путей для общего использования - однако учтите, что не все приложения будут работать с длинными путями, вам следует протестировать более старое программное обеспечение. только программное обеспечение с соответствующей записью манифеста сможет использовать это.</li> </ol><h2>длинный путь префикса</h2><p>windows api имеет специальную функцию, которая поддерживает имена путей unicode длиной до 32 тыс. символов (каждый элемент длиной до 255 символов).</p><p>это часто ошибочно называют unc-именами, но это не так.</p><p>префикс, используемый для указания api использовать длинные пути unicode, <code>\\?\</code> как в:</p><pre><code>\\?\d:\very long path </code></pre><p>имена unc обычно используются при обращении к путям на удаленных серверах в форме <code>\\servername\path name\file name</code>. вы можете комбинировать это с префиксом длинного пути так: <code>\\?\unc\server\share</code></p><p>обратите внимание, что некоторые плохо написанные, но, к сожалению, довольно распространенные приложения не поддерживают пути к файлам unc и префикс длинных путей.</p><p>ссылка: <a href="https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath">https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath</a> </p><h2>поддержка длинного пути</h2><p>эта опция была добавлена в последние версии windows 10. на момент написания этой статьи она не была активирована по умолчанию, поскольку для нее требуется поддержка определенных приложений. интересно, что powershell имеет встроенную поддержку, поэтому включение этой опции позволит использовать длинные пути непосредственно в сценариях powershell.</p><p>вы можете активировать его через редактор групповой политики, если у вас есть версия windows с этим. или вы можете просто использовать следующее изменение реестра. как всегда, пожалуйста, сделайте резервную копию раздела реестра, который вы меняете, прежде чем что-либо делать.</p><ol> <li>запустите <code>regedit.exe</code>.</li> <li>подтвердите запрос uac.</li> <li>перейдите к ключу: <code>hkey\_current\_user\software\microsoft\windows\currentversion\group policy objects\{48981759-12f2-42a6-a048-028b3973495f}machine\system\currentcontrolset\policies</code></li> <li>создайте или измените ключ <code>longpathsenabled</code>.</li> <li>если он не существует, щелкните правой кнопкой мыши policies и выберите new> dword (32-bit) value из меню.</li> <li>установите <code>longpathsenabled</code> в <code>1</code> для включения.</li> </ol><p>любые приложения с соответствующими записями манифеста теперь будут иметь доступ к стандартным длинным путям posix. это должно включать приложения магазина windows.</p><p>ссылка: <a href="https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/">https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/</a> </p><p>обновление 2017-04-09</p><p>@maoizm указал на проблему с разделом реестра выше, поэтому я сделал <a href="https://msdn.microsoft.com/en-us/library/aa365247.aspx">еще копать</a> . похоже, теперь вы можете установить поддержку длинных имен файлов с помощью системного ключа:</p><pre><code>hklm\system\currentcontrolset\control\filesystem longpathsenabled (type: reg\_dword) </code></pre><p>это все еще работает только для приложений, которые специально настроены на его использование (требуется запись в manifest.xml приложения).</p><p>вы должны также отметить, что вы не можете использовать относительные имена путей с этим методом.</p>

<p>мне нравится решение cmd. хотя я хочу поделиться другим обходным путем, который работает даже в обычном проводнике: попробуйте сократить имена родительских папок перед удалением: более короткие имена сократят путь. скажем, у вас есть эта древовидная структура папки:</p><p>c: \</p><p>.. проекты</p><p>.. .. некоторые удивительные проекты весной 2014 года</p><p>.. .. .. активность в парке в городе в пятницу</p><p>.. .. .. .. бла бла бла бла бла бла бла бла бла бла бла бла бла бла</p><p>.. .. .. .. .. актуальные файлы с длинными именами тоже</p><p>в этом случае вы не можете удалить папки, вы не можете удалить или переименовать файлы ни. если вы хотите удалить всю структуру папок или ее часть, вы можете временно переименовать родительские папки и сократить путь, а затем удалить папку. имена могут быть просто буквами:</p><p>c: \</p><p>.. проекты</p><p>.. .. икс</p><p>.. .. .. у</p><p>.. .. .. .. з</p><p>.. .. .. .. .. актуальные файлы с длинными именами тоже</p><p>в моем случае я просто хотел удалить всю папку со многими подпапками и файлами. поэтому меня не заботили названия папок.</p>

<p>решение 7-zip прекрасно работает. другой вариант, если у вас установлен git, это открыть bash shell и использовать:</p><p><code>rm -f</code></p><p>(или <code>rm -rf</code> для папок)</p>

<p>я предлагаю <a href="http://www.ghisler.com/">total commander</a> (условно-бесплатная, но продолжает работать после испытательного периода только с минимальным стартовым экраном). именно так я всегда решаю проблемы <strong>слишком длинное имя файла</strong>.</p>

<p>вы также можете удалить их, используя их эквивалентное короткое имя. <code>dir /x</code> покажет вам их.</p>

<p>я создал простую java-программу, которая использует robocopy для удаления файлов. баночка пригодна для использования. для дополнительного вывода запустите его из строки cmd.</p><p> <a href="https://drive.google.com/file/d/0b5psejxjvt\_1wvp1t3pusm1cnjg/view?usp=sharing">https://drive.google.com/file/d/0b5psejxjvt\_1wvp1t3pusm1cnjg/view?usp=sharing</a> </p>

<p> <a href="https://github.com/lmstearn/bigger-directories/wiki">большие каталоги</a> также предназначены для этой задачи. <a href="https://i.stack.imgur.com/esvat.jpg"> <img src="https://i.stack.imgur.com/esvat.jpg" alt="enter image description here"> </a> </p><ul> <li> <a href="http://www.softpedia.com/get/file-managers/bigger-directories.shtml">скачать</a> </li> <li>использует рекурсивный вызов с removedirectoryw для удаления существующих каталогов</li> <li>использует собственный файловый репозиторий для вновь созданных каталогов</li> <li>файлы могут быть перемещены из каталогов до удаления соответствующих каталогов.</li> <li>быстрый, хотя переход к верхней части каталога - это клик по вложенному каталогу</li> <li>windows xp (sp3) и выше</li> <li>не подписанный неуправляемый код без установщика, поэтому возможно предупреждение smartscreen при запуске из запасной папки, например рабочий стол.</li> </ul><p>больше информации на <a href="https://www.codeproject.com/tips/1089681/bigger-directories">codeproject</a> .</p>

<p>я попробовал все остальные ответы, но они не сработали (по крайней мере, для меня).</p><p><img src="https://i.imgur.com/haw7ezq.png" alt=""></p><p>я наткнулся на <a href="http://www.purgeie.com/delinv/dldelinv.htm">delinfile</a> и работал довольно хорошо и довольно быстро!</p><p>пробная версия ограничена 3 действиями/15 днями, но ее можно использовать, если вы хотите удалить только несколько папок/файлов:</p><p><img src="https://i.imgur.com/jdhonh4.png" alt=""></p>

<p>получил идеальный ответ здесь (для файлов). работает в windows 10.</p><pre><code>rem make sure there is no \ at the end of either path! robocopy "c:\...\...\...\long\path" "c:\deleteme" "filename" /mov rem note: this ^ can be called many times before...: rem finally, recursively delete the higher up deleteme directory. rmdir /s /q deleteme </code></pre><p>смотрите также: <a href="https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath">https://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath</a> </p><p>ни одного альтернативного ответа на 4 вопроса не хватило для моих нужд. добро пожаловать в мир.</p>

<p>я столкнулся с этой проблемой в windows 10 и нашел это простое решение.</p><ol> <li>зайдите немного глубже в ваше дерево папок.</li> <li>перетащите папку из середины дерева в начало дерева, используя адресную строку.</li> <li>как на моем изображении, перетащите красное поле в зеленое поле. (в этом случае путь короче, но для длинных путей он также работает)</li> <li>тогда ваш путь станет короче и удалить как обычно, используя клавишу удаления.</li> </ol><p> <a href="https://i.stack.imgur.com/x5or6.png"> <img src="https://i.stack.imgur.com/x5or6.png" alt="enter image description here"> </a> </p>

<p>я наконец-то узнал, как это сделать с помощью powershell. вот инструкции, которым я следовал, чтобы заставить это работать на windows 7:</p><ol> <li> <p>создайте новую папку с именем<strong> ntfssecurity </strong>в папке <em>c:\users\xxxx\documents\windowspowershell\modules\ntfssecurity</em>, где<strong>xxxx</strong>- ваше имя пользователя windows , пример: если мое имя пользователя было «<em>aspnyc</em>», новая папка была бы <em>c:\users\aspnyc\documents\windowspowershell\modules\ntfssecurity</em>.</p> </li> <li> <p>загрузите пакет <a href="https://ntfssecurity.codeplex.com">модуль powershell для защиты файловой системы</a> - он должен быть доступен в виде простого zip-файла.</p> </li> <li>откройте консоль powershell, запустите<strong> get-module -listavailable </strong>и убедитесь, что<strong> ntfssecurity </strong>отображается где-то в списке зарегистрированных модулей.</li> <li>в консоли powershell запустите<strong> импорт-модуль ntfssecurity </strong>.</li> <li>в консоли powershell запустите<strong> remove-item2 "yyyy" -recurse </strong>, где<strong>yyyy</strong>- это путь windows к папке, которую вы хотите рекурсивно удалить (например, <em>c:\potatoes\badgers\foldertodelete</em>).</li> </ol>

<p>я наконец-то узнал, как это сделать с помощью powershell в windows 10, где отдельные имена файлов были слишком длинными. вот шаги, которые я следовал, чтобы заставить это работать на windows 10:</p><ol> <li>загрузите пакет <a href="https://ntfssecurity.codeplex.com">модуль powershell для защиты файловой системы</a> - он должен быть доступен в виде простого zip-файла.</li> <li>извлеките zip-файл как папку ntfssecurity в каталоге c:\windows\system32\windowspowershell\v1.0\modules.</li> <li>откройте консоль powershell с административными правами (a.k.a. режим администратора) и запустите<strong> get-module -listavailable </strong>и убедитесь, что<strong> ntfssecurity </strong>где-то в списке зарегистрированных модулей.</li> <li>выполнить<strong> set-executionpolicy unrestricted </strong>, чтобы обойти подписанный режим выполнения. вы должны подтвердить это действие с помощью y (es)</li> <li>в конце концов перейдите к папке, которую вы хотите удалить.</li> <li>в консоли powershell запустите<strong> импорт-модуль ntfssecurity </strong>.</li> <li>в консоли powershell запустите<strong> remove-item2 "yyyy" -recurse </strong>, где<strong>yyyy</strong>- относительный или абсолютный путь windows к папке, которую вы хотите рекурсивно удалить (например, <em>c:\potatoes\badgers\foldertodelete</em>).</li> <li>проверьте, сработало ли это.</li> <li>в конце концов вернитесь в режим подписанного выполнения с помощью<strong> set-executionpolicy restricted </strong>. вы должны подтвердить это действие с помощью y (es).</li> </ol>

<p>если у вас установлен bash в ubuntu в windows, вы можете перейти в родительский каталог в обычной командной строке и затем набрать:</p><pre><code>bash -c "rm -rf dirname\_here" </code></pre><p>который запускает bash, рекурсивно удаляет каталог из linux, где нет ограничений на имя файла, а затем возвращается к вашей обычной командной строке.</p>